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, тогда вы можете легко запустить тот же код в браузере или на своем внутреннем сервере многоядерный процессор, и вы сможете использовать все ядра процессора. Это несколько отделяет "деноатскую семантику" и "оперативную семантику" вашего кода.