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

haw*_*eye 10 clojure goroutine clojurescript core.async

正如我们所知道- core.async 采用 CSP,类似于够程去浪.现在对于像select和alt 这样的场景来说,这很有道理.

大卫·诺伦在这里了一个惊人的演示,在Clojure中展示了Clojure中的core.async.

然而,我可以通过简单的for循环复制类似的功能.你可以在这里看到一个演示.

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));
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Mic*_*zyk 13

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

生成的代码使刷新率和更新生成率立即显现出来.你可能接近于清晰的for循环,setTimeout在这种特殊情况下,因为所有的更新生go成都做同样的事情,但是启动多个gos来完成不同的事情同样会很简单.


1例如参见Simon Marlowe的Parallelism/= Concurrency或者Parallelism并不是 Robert Harper对这一点的扩展讨论的并发性.