Clojure core.async和10000个动画进程-在这种情况下,实际的好处是什么?
正如我们所知,这与我们的研究结果相似。现在来看一个类似于和alt的场景 大卫·诺伦在《Clojure》中完成了《ClojureScript》中的动画创作 但我可以用一个简单的for循环复制类似的功能。你可以看到一个Clojure core.async和10000个动画进程-在这种情况下,实际的好处是什么?,clojure,clojurescript,goroutine,core.async,Clojure,Clojurescript,Goroutine,Core.async,正如我们所知,这与我们的研究结果相似。现在来看一个类似于和alt的场景 大卫·诺伦在《Clojure》中完成了《ClojureScript》中的动画创作 但我可以用一个简单的for循环复制类似的功能。你可以看到一个 函数animationLoop(){ 对于(var i=0;i,您可能知道javascript是单线程的,如果您在“实际执行/操作”方面使用core.async,您将不会获得太多好处,但是当您的基于循环的代码与使用所有CPU核心(如JVM)的运行时环境中的core.async代码相比
函数animationLoop(){
对于(var i=0;i,您可能知道javascript是单线程的,如果您在“实际执行/操作”方面使用core.async,您将不会获得太多好处,但是当您的基于循环的代码与使用所有CPU核心(如JVM)的运行时环境中的core.async代码相比较时然后您将看到异步代码的性能优势
因此,基本上,如果您有一些纯算法代码(不依赖于运行时环境特性,如DOM等),并且是使用core.async编写的,那么您可以轻松地在浏览器或后端多核CPU上运行相同的代码,您将可以使用所有CPU核。这有点类似于将“指称语义学”与“操作语义学”演示的目的是演示使用core.async在ClojureScript中实现并发性。最大的成功在于以标准的顺序方式编写所有线程,而无需将它们拆分为回调或手动管理交错,并在通道阻塞的幻觉中实现(包括超时通道;通过阻塞,go
将控制权让给其他并发的go
s)。当然,仍然没有并行性,但这是一个完全正交的概念1;在GUI应用程序中使用线程在多核CPU普及之前很久就是一种有用的技术
由此产生的代码使刷新率和更新生成率等事情立即变得显而易见。在这种特殊情况下,您可能会使用for
循环和setTimeout
来清晰地接近,因为所有生成go
s的更新都做相同的事情,但是启动多个go
s来完成完全不同的事情也同样简单
我想这是一个有10000次迭代的循环,而不是10000次“伪循环”-线程可以包含它们自己的逻辑,也就是说,这段代码并不代表10000个进程,尽管我知道答案,但所有优秀的背景信息都让你读起来很棒!@lgrapenthin干杯,很高兴听到这个消息。
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));
}
}
}
}