Node.js 节点中的竞争条件问题?
人们说像Javascript这样的单线程语言不能解决这个问题。然而,nodejs提供了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
集群
来分叉多个工作者。这会导致比赛状态出现问题吗
此外,我有一个例子有时会让我感到困惑:
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一起使用非常简单。看见