Node.js 节点中的竞争条件问题?

Node.js 节点中的竞争条件问题?,node.js,race-condition,Node.js,Race Condition,人们说像Javascript这样的单线程语言不能解决这个问题。然而,nodejs提供了集群来分叉多个工作者。这会导致比赛状态出现问题吗 此外,我有一个例子有时会让我感到困惑: ALLSESSIONS = {}; //session id saved in cookie ALLSESSIONS[sessionid] = 'somevalue'; var SESSION = ALLSESSIONS[sessionid]; ... do stuff for sometimes console.log

人们说像Javascript这样的单线程语言不能解决这个问题。然而,nodejs提供了
集群
来分叉多个工作者。这会导致比赛状态出现问题吗

此外,我有一个例子有时会让我感到困惑:

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

var SESSION = ALLSESSIONS[sessionid];
... do stuff for sometimes
console.log(SESSION);
我担心,当另一个请求在当前请求仍在运行时到达节点时,它可能会用自己的会话id覆盖
会话
变量,那么当前请求的结果是
未确定


这会在节点中发生吗?

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

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

然而,将会话信息保存在内存中可能不是一个好主意!如果工作线程或应用程序线程崩溃,则会话数据丢失。最好使用某种持久性存储


一般来说,如果您有一个全局范围的变量被写入多个请求线程并从中读取,则可能会出现争用条件。

回答了您关于争用条件的一些问题。是的,如果以这种方式编写程序,您可能会有两个相互冲突的独立请求,但在大多数情况下,您的请求不应该写入全局变量。然而,这并不是
cluster
引入的问题,在错误地编写异步代码时也会发生这种情况。如果您有任何希望我们调试的真实代码,请向我们展示,因为您的示例不太具有描述性。从您的观点来看,如果我将会话存储在文件中,
session
变量仍然是全局范围,因为所有工作人员都可以访问系统中的任何文件。我想得对吗?是的-如果要将会话存储在文件中,则
SESSION
变量本质上是全局范围。所有工作人员都将访问这些文件-如果您不小心“阻止”这些文件的I/O,可能会导致竞争条件。感谢您的回复。顺便问一下,您对节点中的共享数据(例如会话)有何建议?我很幸运地使用了mongodb和postgres会话存储。在运行节点的服务器上安装mongodb通常非常简单,社区提供了一些软件包,使其与express framework一起使用非常简单。看见