CORE.ASYNC и 10000 процессов для анимации - какова фактическая выгода в этом сценарии?
-
21-12-2019 - |
Вопрос
Как мы знаем - Core.async использует CSP и похоже на groutines from go-lang . Теперь для сценария, такого как Выбрать и alt Это имеет большое значение .
David Nolen сделал Удивительная демонстрация здесь, показывающая CREAR.ASYNC в Clojure на работе в анимации в clojuescript.
Но я могу воспроизвести аналогичную функциональность с простым для цикла. Вы можете увидеть Demo здесь .
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 процессов?
Решение
Цель демонстрации заключается в продемонстрировании достижения параллелизма в clojurecript с core.async. Большие победы в написании всех нитей в стандартной, последовательной моды, не требуя от разрыва их в обратных вызовах или управлять взаимосвязью вручную, а в иллюзии блокировки на каналах (включая каналы тайм-аута; блокируя, генеракодицетагкод. для других одновременных генеракодицетагодов). Конечно, есть еще нет параллелизма , но это полностью ортогональная концепция 1 ; Использование потоков в Apps GUI была полезной техникой задолго до того, как многоязычные процессоры стали обычным явлением.
Полученный код делает такие вещи, как частоту обновления, а также скорость генерации обновления. Возможно, вы можете приблизиться к четкости с циклами go
и GeneracodicCode в этом конкретном случае, потому что все генерирующие обновления генеракодицетагкоды делают то же самое, но запуск нескольких генеракодицетагкодов, чтобы сделать совершенно разные вещи, будет одинаково простым.
1 см. Для примера Параллелизм /= совпадение Саймон Марлоу или Параллелизм не совпадает Роберт Харпер для расширенного обсуждения этот момент.
Другие советы
Как вы, вероятно, знаете, что JavaScript является одиночной резьбой, и если вы используете CORE.ASYNC с точки зрения «фактического выполнения / операций», вы не получите большую пользу, но когда ваш код на основе LOOP сравнивается с кодом CORE.ASYNCВ среде выполнения, которая использует все ядра CPU (например, JVM), вы увидите преимущество Async Code.
Итак, в основном, если у вас есть несколько чистых GenaCodicetacodcode (без функций HECEDENTION на функциях среды выполнения, как DOM и т. Д.), что вы написали с помощью Core.Async, то вы можете легко запускать один и тот же код в браузере или на заднем плане MULTICORE CPUИ вы будете использовать все ядра CPU.Это несколько на линиях отделения «деноциональной семантики» и «оперативной семантики» вашего кода.