问候,
我一直在研究javascript,nodejs。我不明白如何在javascript中避免并发问题。
让我说我正在研究一个对象
var bigObject = new BigObject();
我有一个setTimer(function(){ workOnBigOjbect...} )
也可以在bigOjbect
上工作。
如果我将磁盘IO写入bigObject
,并且计时器对象正在bigObject
上运行,并定期从bigObject
读取代码,那么如何避免并发问题?
在常规语言中,我会使用互斥或线程安全的队列/命令模式。我也没有看到关于javascript竞争条件的讨论。
我错过了什么吗?
答案 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,它确保如果代码正在执行,它会在任何其他(异步)代码运行之前完全执行,因此,没有并发问题。
如果您的示例在调用计时器回调时,它将完全执行,并且永远不会在中间被抢占以执行其他一些代码。