我正在为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正确,是否存在使用多个线程的其他实现,并且需要锁定机制来确保线程安全?
答案 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程序员不会担心混乱访问(多线程)而是担心无序(异步)访问数据。