据我们所知 - 核心异步 用途 太阳能光伏发电 并且类似于 协程戈朗. 。现在对于这样的场景 选择 和替代品 这很有意义.

大卫·诺伦已经做到了 这里有一个很棒的演示,展示了 core.async 在 Clojure 中使用 ClojureScript 进行动画工作。

然而,我可以通过一个简单的 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));
            }
        }
    }
}

我的问题是 core.async在“10000个进程动画场景”中的实际好处是什么?

有帮助吗?

解决方案

该演示的目的是演示实现 并发性 在 ClojureScript 中使用 core.async。最大的胜利在于以标准、顺序的方式编写所有线程,而不需要将它们分解为回调或手动管理交错,以及阻塞通道(包括超时通道;通过阻止,a go 将控制权交给其他并发 gos)。当然还是没有 并行性, ,但这是一个完全正交的概念1;早在多核 CPU 普及之前,在 GUI 应用程序中使用线程就是一项有用的技术。

生成的代码使刷新率和更新生成率等内容立即变得显而易见。你可能可以清楚地了解 for 循环和 setTimeout 在这种特殊情况下,因为所有更新生成 gos 做同样的事情,但是启动多个 go做完全不同的事情同样简单。


1 参见示例 并行性/=并发性 作者:西蒙·马洛 或 并行不是并发 罗伯特·哈珀 (Robert Harper) 对这一点进行了深入的讨论。

其他提示

如您所知,JavaScript是单线程,如果您在“实际执行/操作”方面使用Core.Async,则不会获得太多效益,但是当基于循环的代码与Core.Async代码进行比较时在运行时环境中使用所有CPU核心(如JVM),那么您将看到异步代码的性能效益。

所以,基本上,如果您有一些使用core.async所写的纯algorithmic code(没有运行时环境特征,如dom等),那么您可以在浏览器或后端多核cpu上轻松地运行相同的代码您将使用所有CPU核心。这有点在于分离代码的“去职语义”和“运行语义”的行。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top