Core.async и 10000 процессов для анимации - какова фактическая выгода в этом сценарии?

Как известно - core.async использует CSP и похож на goroutines из go-lang. Теперь для сценария, такого как выберите и alt это имеет большой смысл.

Дэвид Нолен сделал удивительную демонстрацию здесь, в которой показан core.async в Clojure при работе в анимации на ClojureScript.

Тем не менее, я могу воспроизвести аналогичную функциональность с помощью простого цикла. Здесь вы можете увидеть демонстрацию .

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));
            }
        }
    }
}

Мой вопрос Какова фактическая выгода core.async в сценарии анимации процессов 10, 000?

Ответ 1

Цель демонстрации - продемонстрировать достижение concurrency в ClojureScript с помощью core.async. Большие победы заключаются в написании всех потоков стандартным последовательным способом без необходимости разбивать их на обратные вызовы или управлять перемежением вручную, а также иллюзией блокировки каналов (включая каналы таймаута, блокируя, go дает управление другим параллельным go s). Конечно, до сих пор нет parallelism, но это вполне ортогональное понятие 1; использование потоков в приложениях с графическим интерфейсом было полезной техникой задолго до того, как многоядерные процессоры стали обычным явлением.

Полученный код делает очевидными такие вещи, как частота обновления и скорость генерации обновлений. Вероятно, вы могли бы приблизиться к ясности с циклами for и setTimeout в этом конкретном случае, потому что все генерирующие обновление go делают то же самое, но запуск нескольких go для выполнения совершенно разных вещей будет одинаково простым.


1 См., например, Parallelism/= Concurrency Саймон Марлоу или Parallelism не является Concurrency Робертом Харпером для расширенного обсуждения этого вопроса.

Ответ 2

Как вы, вероятно, знаете, что javascript является однопоточным, и если вы используете core.async с точки зрения "фактического выполнения/операций", вы не получите большую пользу, но когда ваш код на основе цикла сравнивается с кодом core.async в среде выполнения, которая использует все ядра ЦП (например, JVM), вы увидите преимущества асинхронного кода.

Итак, в основном, если у вас есть чистый algorithmic code (без зависимостей от функций среды разработки, например DOM и т.д.), которые вы написали с помощью core.async, тогда вы можете легко запустить тот же код в браузере или на своем внутреннем сервере многоядерный процессор, и вы сможете использовать все ядра процессора. Это несколько отделяет "деноатскую семантику" и "оперативную семантику" вашего кода.