在 manager / worker 模式中使用子进程以确保线程安全时,Node.js 中是否需要锁定?
Are locks necessary in Node.js when using child processes in a manager / worker pattern to ensure thread safety?
我正在为 Node.js 编写一个简单的、基于消息的管理器/工作者 (http://lya.fciencias.unam.mx/jloa/patrones/MW.html) 模块。通常,在多线程环境中,修改数据的代码需要一个锁,以防止其他线程在例程中更改数据,从而导致混乱的竞争条件。例如:
function assignWork(job) {
if (!this.isWorkComplete && this.workerQueue.length != 0) {
this.workerQueue.pop().runJob(job);
}
}
以上代码在多线程环境中需要锁,因为另一个线程可能会在该线程检查它是否已填充和弹出之间清空工作队列worker 掉队,导致错误。
不过据我了解,由于Node使用的是单事件队列,所以同步代码不可能出现上述问题,因为一次只执行一个线程。
这个假设是否正确?此外,如果它对 Node 来说是正确的,是否存在其他使用多线程并需要锁定机制来确保线程安全的实现?
来自 the Node 6.0.0 documentation:
A single instance of Node.js runs in a single thread. To take
advantage of multi-core systems the user will sometimes want to launch
a cluster of Node.js processes to handle the load.
Javascript 是单线程的,因此在任何当前正确的 javascript 引擎中都没有线程安全问题。
到目前为止,我们在 Javascript 中拥有的唯一真正的多线程是 Web worker。它们使用消息传递进行通信,因此它们不共享内存(至少 javascript 开发人员看不到;引擎可能)。
竞争条件在单线程环境中仍然很有可能发生。回调可能很棘手。
是的,Filip 完全正确,Node.js 虽然内部是多线程的,但为 运行 和 javascript 代码提供单线程接口,因此每个操作都是线程安全的。我没有遇到任何竞争条件的场景,因为系统中没有第二方可以与之竞争。就此而言,还请注意共享数据操作逻辑(例如同步、互斥、易失性、监视器、屏障、信号量等)中的 'usual suspects' 在语言语义本身中不存在。希望这能给你足够的证据和信心。
最重要的是,Node 程序员不会担心访问混乱(多线程),而是担心数据访问无序(异步)。
我正在为 Node.js 编写一个简单的、基于消息的管理器/工作者 (http://lya.fciencias.unam.mx/jloa/patrones/MW.html) 模块。通常,在多线程环境中,修改数据的代码需要一个锁,以防止其他线程在例程中更改数据,从而导致混乱的竞争条件。例如:
function assignWork(job) {
if (!this.isWorkComplete && this.workerQueue.length != 0) {
this.workerQueue.pop().runJob(job);
}
}
以上代码在多线程环境中需要锁,因为另一个线程可能会在该线程检查它是否已填充和弹出之间清空工作队列worker 掉队,导致错误。
不过据我了解,由于Node使用的是单事件队列,所以同步代码不可能出现上述问题,因为一次只执行一个线程。
这个假设是否正确?此外,如果它对 Node 来说是正确的,是否存在其他使用多线程并需要锁定机制来确保线程安全的实现?
来自 the Node 6.0.0 documentation:
A single instance of Node.js runs in a single thread. To take advantage of multi-core systems the user will sometimes want to launch a cluster of Node.js processes to handle the load.
Javascript 是单线程的,因此在任何当前正确的 javascript 引擎中都没有线程安全问题。
到目前为止,我们在 Javascript 中拥有的唯一真正的多线程是 Web worker。它们使用消息传递进行通信,因此它们不共享内存(至少 javascript 开发人员看不到;引擎可能)。
竞争条件在单线程环境中仍然很有可能发生。回调可能很棘手。
是的,Filip 完全正确,Node.js 虽然内部是多线程的,但为 运行 和 javascript 代码提供单线程接口,因此每个操作都是线程安全的。我没有遇到任何竞争条件的场景,因为系统中没有第二方可以与之竞争。就此而言,还请注意共享数据操作逻辑(例如同步、互斥、易失性、监视器、屏障、信号量等)中的 'usual suspects' 在语言语义本身中不存在。希望这能给你足够的证据和信心。
最重要的是,Node 程序员不会担心访问混乱(多线程),而是担心数据访问无序(异步)。