问候,

我一直在研究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中没有并发控制工具 更多细节。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top