在NodeJS中的进程之间同步全局值

时间:2015-02-07 10:29:01

标签: node.js synchronization thread-safety

在NodeJS中,我有两个操作单个全局值的异步函数,这是一个例子:

var someValue = 0;

function longTask {
    // ...
    // very long process here
    // ...
    someValue += incrementValue; // modify value
    // ...
    // very long process again
    // ...
}

function shortTask {
    // get the value
    return someValue;
}

这两个可以随时调用。 (例如,我正在使用Socket.io)
shortTask仍在运行时,longTask可能会被调用 我担心的是,当发生这种情况时,shortTask可能会导致someValue错误。

我应该将代码调整为这样吗?

var someValue = 0;
var longTaskRunning = false;

function longTask {
    longTaskRunning = true;
    // ...
    // very long process here
    // ...
    someValue += incrementValue; // modify value
    // ...
    // very long process again
    // ...
    longTaskRunning = false;
}

function shortTask {
    if (longTaskRunning) {
        setTimeout(shortTask, 500); // Delay this function
    } else {
        return someValue;
    }
}

我还听说NodeJS是单线程的 那么,这是一个问题吗?

1 个答案:

答案 0 :(得分:1)

Node是单线程的,它使用异步模型而不是多线程。两段代码同时运行是不可能的。您可以在多个流程中运行代码(使用child_processcluster模块在​​节点中可以运行),但在这种情况下,全局someValue对于每个流程都是唯一的。

因此,在任何情况下,您都不必担心会同时调用longTaskshortTask

PS 请参阅this video以更好地了解异步内容。