我已经读过Node.js基于事件循环提供并发性。但并发意味着什么事情同时发生?事件循环就在那里,因为它处理一些代码,一个接一个地执行,而不是同时执行。
例如,Alexandru在他关于Node.js(https://www.airpair.com/javascript/node-js-tutorial)
的教程中写道Node是单线程的,并使用基于事件的并发模型 环。它是非阻塞的,所以它不会使程序等待,但是 相反,它注册一个回调,让程序继续。这个 意味着它可以处理没有多个线程的并发操作 执行,所以它可以很好地扩展。
JavaScript中是否存在并发性?我的想法是只有Web Workers才能在JavaScript中启用并发性,是否可以通过前端或后端的其他方式实现?
答案 0 :(得分:1)
Userland程序控制流程在JavaScript中是单线程的。
如果并发有两个任务在同一时间段内合作完成,那么是的,你可以通过实现自己的调度程序在JavaScript中实现这一点。
要利用本机功能,您可以使用生成器来创建协同例程。
可以通过主机环境提供的API卸载某些异步活动(例如setTimeout
/ window.fetch
)。通过这种方式,主机环境支持并发行为,但此功能不是JavaScript语言规范的一部分。
最后,语言规范定义了Promise
行为,这可能会定义一些异步行为(我没有仔细阅读规范,我知道实现确实使用了“微任务”)因此启用了本机并发。
但是您的用户区代码仍然是单线程的,并且仅在适当的时间安排在单个执行线程上执行continuation。
如果并行性是并发的一个子集,其中正在运行的任务“更独立且不合作”,那么这可以通过WebWorkers和其他JS运行时IIUC的启动来实现。
答案 1 :(得分:0)
如果你看一下"并发"的维基定义:
在计算机科学中,并发性是程序,算法或问题的可分解性属性,与订单无关或部分有序的组件或单元。
它实际上是并发的,因为并发性只是"可分解性"计划的财产。
但您可能意味着您可以以并行方式执行代码。
让我们忽略各种并行扩展(WebWorkers,...)。
答案是JS代码只是单线程的,所以没有"并发" (根据您的意思),但 js api调用的代码可以是多线程/异步。例如,XmlHttpRequests
请求在它们自己的线程中运行,它们是从JS代码触发的,它们可以与JS代码同时运行。