JavaScript-事件驱动和并发问题?
-
25-09-2019 - |
题
问候,
我一直在研究JavaScript,Nodejs。而且我不明白如何在JavaScript中避免并发问题。
假设我正在研究一个物体
var bigObject = new BigObject();
我有一个 setTimer(function(){ workOnBigOjbect...} )
这也会做 bigOjbect
.
如果我的磁盘被写入 bigObject
, ,和一个计时器对象 bigObject
, ,并定期从编码读取 bigObject
, ,如何避免并发问题?
在常规语言中,我将使用MUTEX或线程安全队列/命令模式。我也看不到关于JavaScript种族条件的太多讨论。
我想念什么吗?
解决方案
Node.js的全部要点是它是事件驱动的。所有代码均在事件处理程序中以单个线程运行。没有并发问题,因为代码不会同时运行。不利的一面是,每个事件处理程序都必须迅速退出,因为它会阻止其他事件。
在您的示例中,代码将启动磁盘IO并立即退出。 Node.js基础架构将通知程序通过运行事件处理程序完成IO操作。计时器事件将在IO事件发生之前或之后进行调用,但绝不会同时进行。
其他提示
JavaScript是单线程。如果在应该执行函数时(基于您称为settimer的方式)并且父代码仍在运行时到达时间,则该函数将在父代码完成之前不会执行。
只有一个线程;看: 多核机上的节点。
我会推测这是因为基础V8 JavaScript引擎不支持多个线程,因为通常在浏览器内执行JavaScript(在Windows Case中只有一个UI线程),并且不支持多个线程。
JavaScript中有这个东西叫做 跑步完成 这确保如果代码执行它在任何其他(异步)代码运行之前完全执行,因此,没有并发问题。
如果您的示例,只要调用计时器回调,它将完全执行,并且永远不会在中间抢占其他代码。
看 为什么在JavaScript中没有并发控制工具 更多细节。