core.async和10,000个动画过程 - 这种情况下的实际好处是什么?

时间:2014-01-09 23:05:55

标签: clojure clojurescript goroutine core.async

我们知道 - core.async uses CSPgoroutinesgo-lang类似。现在针对select和alt this makes a lot of sense等方案。

David Nolen在Clojure中完成了an amazing demo here showing core.async在ClojureScript中的动画工作。

然而,我可以使用简单的for循环复制类似的功能。你可以看到demo here

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

我的问题是“10,000流程动画场景”中core.async的实际好处是什么?

2 个答案:

答案 0 :(得分:13)

该演示的目的是演示使用core.async在ClojureScript中实现并发。最大的好处是以标准的顺序方式编写所有线程,而不需要将它们拆分成回调或手动管理交错,以及阻塞通道的假象(包括超时通道;通过阻塞,{{1将控制权交给其他并发go s)。当然,仍然没有 parallelism ,但这是一个完全正交的概念 1 ;在多核CPU变得普遍之前很久,在GUI应用程序中使用线程是一种有用的技术。

生成的代码会立即显示刷新率和更新生成率。在这种特殊情况下,您可能会明确地使用go循环和for,因为所有生成更新的setTimeout执行相同的操作,但启动了多个go做完全不同的事情同样会很简单。


1 参见Simon Marlowe的例如Parallelism /= Concurrency或Robert Harper的Parallelism is not concurrency对此进行的扩展讨论。

答案 1 :(得分:2)

正如您可能知道javascript是单线程的,如果您在“实际执行/操作”方面使用core.async,您将无法获得太多好处,但是当您的基于循环的代码与core.async代码进行比较时在使用所有CPU核心(如JVM)的运行时环境中,您将看到异步代码的性能优势。

所以,基本上如果你有一些纯algorithmic code(不依赖于运行环境功能,比如DOM等)你用core.async写的那么你可以轻松地在浏览器中运行相同的代码或在你的背上运行 - 多核CPU,您将使用所有CPU核心。这有点像分离代码的“denoational语义”和“操作语义”。