Domanda

Come sappiamo - core.async usi csp ed è simile a Goroutines da go-lang . Ora per uno scenario come selezionare e alt Ciò ha molto senso .

David Nolen ha fatto Una demo fantastica qui mostrando core.async in clojure al lavoro in animazione in clojecript.

Eppure posso replicare una funzionalità simile con un semplice per ciclo. Puoi vedere un Demo qui .

function animationLoop() {
    for (var i =0;i<100;i++) {
        for (var j= 0; j<100;j++) {
            //decision to animate or hold off
            var decisionRange = randomInt(0,10);
            if (decisionRange < 1) {
                var cell = document.getElementById('cell-' + i + j);
                cell.innerHTML = randomInt(0,9);
                cell.setAttribute('class','group' + randomInt(0,5));
            }
        }
    }
}
.

La mia domanda è Qual è il beneficio effettivo di Core.Async nella scenario di animazione '10, 000 processi?

È stato utile?

Soluzione

Lo scopo della demo è dimostrare il raggiungimento di concorrenza in clojecript con core.async. Le grandi vittorie sono per scrivere tutte le discussioni in modo standard, sequenziale, senza bisogno di romperle a parte in callback o gestire l'interleaving a mano, e nell'illusione del blocco sui canali (compresi i canali di timeout; bloccando, un controllo dei rendimenti go ad altri generacoli concorrenti). Naturalmente non c'è ancora alcuna parallelismo , ma questo è un concetto completamente ortogonale 1 ; L'utilizzo di fili nelle app GUI è stata una tecnica utile molto prima che le CPU multicore siano diventate comuni.

Il codice risultante rende le cose come il tasso di aggiornamento e il tasso di generazione di aggiornamento immediatamente evidente. Probabilmente potresti avvicinarsi a chiarezza con anelli go e for in questo caso particolare, perché tutti i generatori generatori di aggiornamento generanodiceagcodes fanno la stessa cosa, ma lanciare più generatori setTimeout per fare cose completamente diverse sarebbe ugualmente semplice.


.

1 Vedere ad esempio parallelismo /= Concurrency Simon Marlowe o Il parallelismo non è concorrenza di Robert Harper per una discussione estesa di questo punto.

Altri suggerimenti

Come probabilmente sappia che JavaScript è filettato single e se usi Core.Async in termini di "Esecuzione / operazioni effettiva" Non otterrai molto beneficio, ma quando il codice basato su Loop viene confrontato con il codice Core.AsyncIn un ambiente di runtime che utilizza tutti i core della CPU (come JVM), quindi vedrai il vantaggio delle prestazioni del codice ASYNC.

Così, fondamentalmente se si dispone di un povero algorithmic code (senza detedio su funzionalità di runtime environment, come DOM ecc.) che hai scritto utilizzando Core.AsyNC, quindi è possibile eseguire facilmente lo stesso codice nel browser o sulla CPU multicolore di back-endE potrai usare tutti i core della CPU.Questo è un po 'sulle linee di separazione della "semantica dentale" e "Semantica operativa" del tuo codice.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top