节点中的竞争条件问题?

时间:2014-08-06 15:31:42

标签: node.js race-condition

人们说像Javascript这样的单线程语言无法解决这个问题。但是,nodejs提供cluster来分叉多个worker。这会导致race condition问题吗?

而且,我有一个例子,有时会引起我的困惑:

ALLSESSIONS = {};
//session id saved in cookie
ALLSESSIONS[sessionid] = 'somevalue';

var SESSION = ALLSESSIONS[sessionid];
... do stuff for sometimes
console.log(SESSION);

我担心当另一个请求在当前请求仍在运行时到达节点时,它可能会用自己的会话ID覆盖SESSION变量,然后当前请求的结果为undetermined

这会发生在节点吗?

1 个答案:

答案 0 :(得分:1)

当另一个请求在当前请求仍在运行时到达节点时,它不会用自己的请求覆盖会话变量。

群集允许您拥有多个工作人员,并且这些工作人员将彼此分开。这意味着如果您的ALLSESSIONS变量的范围限定为单个工作程序,那么它实际上只包含给定工作程序的会话信息。您需要将ALLSESSIONS变量限定在应用程序(前叉)级别,以便跨工作程序共享它。

但是,将会话信息保存在内存中可能不是一个好主意!如果您的工作者或应用程序线程崩溃,那么您丢失了会话数据。使用某种持久性存储可能更好。

通常,如果您在多个请求线程中写入和读取全局范围变量,则可能会出现竞争条件。