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

时间:2010-11-17 21:03:10

标签: javascript concurrency node.js race-condition

问候,

我一直在研究javascript,nodejs。我不明白如何在javascript中避免并发问题。

让我说我正在研究一个对象

var bigObject = new BigObject();

我有一个setTimer(function(){ workOnBigOjbect...} )也可以在bigOjbect上工作。

如果我将磁盘IO写入bigObject,并且计时器对象正在bigObject上运行,并定期从bigObject读取代码,那么如何避免并发问题?

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

我错过了什么吗?

4 个答案:

答案 0 :(得分:9)

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

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

答案 1 :(得分:3)

Javascript是单线程的。如果时间到达时你的函数应该执行(基于你如何调用setTimer),并且父代码仍在运行,那么在父代码完成之前函数将不会执行。

答案 2 :(得分:2)

只有一个线程;见:Node.js on multi-core machines

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

答案 3 :(得分:1)

这就是javascript中的这个东西叫Run-to-Completion,它确保如果代码正在执行,它会在任何其他(异步)代码运行之前完全执行,因此,没有并发问题。

如果您的示例在调用计时器回调时,它将完全执行,并且永远不会在中间被抢占以执行其他一些代码。

有关详细信息,请参阅Why no concurrency control tool in javascript