说Node.js&是不正确的。 JavaScript提供基于事件循环的并发模型?

时间:2016-11-14 13:33:11

标签: javascript node.js multithreading concurrency

我已经读过Node.js基于事件循环提供并发性。但并发意味着什么事情同时发生?事件循环就在那里,因为它处理一些代码,一个接一个地执行,而不是同时执行。

例如,Alexandru在他关于Node.js(https://www.airpair.com/javascript/node-js-tutorial

的教程中写道
  

Node是单线程的,并使用基于事件的并发模型   环。它是非阻塞的,所以它不会使程序等待,但是   相反,它注册一个回调,让程序继续。这个   意味着它可以处理没有多个线程的并发操作   执行,所以它可以很好地扩展。

JavaScript中是否存在并发性?我的想法是只有Web Workers才能在JavaScript中启用并发性,是否可以通过前端或后端的其他方式实现?

2 个答案:

答案 0 :(得分:1)

Userland程序控制流程在JavaScript中是单线程的。

如果并发有两个任务在同一时间段内合作完成,那么是的,你可以通过实现自己的调度程序在JavaScript中实现这一点。

要利用本机功能,您可以使用生成器来创建协同例程。

可以通过主机环境提供的API卸载某些异步活动(例如setTimeout / window.fetch)。通过这种方式,主机环境支持并发行为,但此功能不是JavaScript语言规范的一部分。

最后,语言规范定义了Promise行为,这可能会定义一些异步行为(我没有仔细阅读规范,我知道实现确实使用了“微任务”)因此启用了本机并发。

但是您的用户区代码仍然是单线程的,并且仅在适当的时间安排在单个执行线程上执行continuation。

如果并行性是并发的一个子集,其中正在运行的任务“更独立且不合作”,那么这可以通过WebWorkers和其他JS运行时IIUC的启动来实现。

答案 1 :(得分:0)

如果你看一下"并发"的维基定义:

  

在计算机科学中,并发性是程序,算法或问题的可分解性属性,与订单无关或部分有序的组件或单元。

它实际上是并发的,因为并发性只是"可分解性"计划的财产。

但您可能意味着您可以以并行方式执行代码。

让我们忽略各种并行扩展(WebWorkers,...)。

答案是JS代码只是单线程的,所以没有"并发" (根据您的意思), js api调用的代码可以是多线程/异步。例如,XmlHttpRequests请求在它们自己的线程中运行,它们是从JS代码触发的,它们可以与JS代码同时运行。