人们说像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
。
这会发生在节点吗?
答案 0 :(得分:1)
当另一个请求在当前请求仍在运行时到达节点时,它不会用自己的请求覆盖会话变量。
群集允许您拥有多个工作人员,并且这些工作人员将彼此分开。这意味着如果您的ALLSESSIONS变量的范围限定为单个工作程序,那么它实际上只包含给定工作程序的会话信息。您需要将ALLSESSIONS变量限定在应用程序(前叉)级别,以便跨工作程序共享它。
但是,将会话信息保存在内存中可能不是一个好主意!如果您的工作者或应用程序线程崩溃,那么您丢失了会话数据。使用某种持久性存储可能更好。
通常,如果您在多个请求线程中写入和读取全局范围变量,则可能会出现竞争条件。