在管理器/工作者模式中使用子进程以确保线程安全时,Node.js中是否需要锁定?

时间:2016-04-27 20:17:25

标签: node.js multithreading thread-safety child-process

我正在为Node编写一个简单的,基于消息的管理器/工作者(http://lya.fciencias.unam.mx/jloa/patrones/MW.html)模块。通常,在多线程环境中,修改数据的代码需要锁定以防止其他线程在例程中更改数据,从而导致混乱的竞争条件。例如:

function assignWork(job) {
    if (!this.isWorkComplete && this.workerQueue.length != 0) {
        this.workerQueue.pop().runJob(job);
    }
}

在多线程环境中,上述代码需要锁定,因为在该线程检查填充它的时间和弹出工作线程的时间之间,另一个线程可能会清空工作队列离开队列,导致错误。

然而,我的理解是,由于Node使用单个事件队列,因此同步代码不可能出现上述问题,因为一次只执行一个线程。

这个假设是否正确?此外,如果Node正确,是否存在使用多个线程的其他实现,并且需要锁定机制来确保线程安全?

2 个答案:

答案 0 :(得分:1)

来自the Node 6.0.0 documentation

  

Node.js的单个实例在单个线程中运行。采取   用户有时希望推出的多核系统的优势   一组Node.js进程来处理负载。

Javascript是单线程的,因此在任何当前正确的javascript引擎中都没有线程安全问题。

到目前为止,我们在Javascript中唯一真正的多线程是Web worker。这些使用消息传递进行通信,因此它们不共享内存(至少对于javascript开发人员来说是不可见的;引擎可能)。

在单线程环境中,竞争条件仍然非常可行。回调可能很棘手。

答案 1 :(得分:1)

是的,Filip是绝对正确的,Node.js虽然内部是多线程的,但提供单个线程接口来运行javascript代码,因此每个操作都是线程安全的。我没有遇到任何竞争条件的情况,因为系统中没有第二方可以竞争。为此,请注意语言语义本身中不存在共享数据操作逻辑中的“常见嫌疑人”(例如同步,互斥,易失性,监视器,屏障,信号量等)。希望这能给你足够的证据和信心。

底线是Node程序员不会担心混乱访问(多线程)而是担心无序(异步)访问数据。