javascript – 事件驱动和并发问题?

问候,

我一直在学习javascript,nodejs。 而我不明白如何在JavaScript中避免并发问题。

可以说我正在处理一个对象

var bigObject = new BigObject(); 

我有一个setTimer(function(){ workOnBigOjbect...} ) ,也将在bigOjbect工作。

如果我将磁盘IO写入bigObject ,并使用一个定时器对象来处理bigObject ,并定期从bigObject读取代码,那么如何避免并发问题呢?

在常规语言中,我会使用互斥或​​线程安全的队列/命令模式。 我也没有看到有关JavaScript的竞争条件的讨论。

我错过了什么吗?

node.js的重点在于它是事件驱动的。 所有代码都在单个线程中的事件处理程序中运行。 没有并发问题,因为代码不能同时运行。 缺点是每个事件处理程序必须快速退出,因为它阻止了其他事件。

在你的例子中,代码将启动磁盘IO并立即退出。 node.js基础结构将通过运行事件处理程序来通知程序IO操作已完成。 定时器事件将在IO事件之前或之后被调用,但不会同时发生。

Javascript是单线程的。 如果时间到了,当你的函数应该执行的时候(根据你调用的setTimer的方式),并且父代码仍然在运行,那么这个函数将不会执行,直到父代码完成。

只有一个线程; 请参阅: 多核机器上的Node.js

我会推测这是因为底层的V8 JavaScript引擎不支持multithreading,因为通常JavaScript在浏览器(在Windows的情况下只有一个UI线程)执行,并且不支持multithreading。

JavaScript中有这样的东西叫做Run-to-Completion ,它可以确保如果代码正在执行,它将在任何其他(asynchronous)代码运行之前完全执行,因此不会产生并发问题。

在你的例子中,每当定时器callback被调用时,它将会完全执行,并且不会在中间执行其他代码。

有关更多详细信息,请参阅为什么JavaScript中没有并发控制工具 。