Javascript 全局变量分配在NodeJS上是原子的吗?

Javascript 全局变量分配在NodeJS上是原子的吗?,javascript,websocket,concurrency,global-variables,nodejs-server,Javascript,Websocket,Concurrency,Global Variables,Nodejs Server,我正在节点上开发一个有状态的websocket服务器。我们需要一段对biz逻辑很重要的只读数据,并将其保存在节点的全局范围内,最近我们必须使此require缓存无效,并重新要求允许在运行时更改此数据段。我的问题是,我们是否应该简单地重新分配全局变量?重新请求的结果将导致在不同阶段读取此数据副本的并发连接之间出现问题?谢谢 全局变量分配在NodeJS上是原子的吗 由于node.js仅以单线程方式运行Javascript,因此所有分配在Javascript中都是原子的 我们是否应该担心仅仅重新分配全

我正在节点上开发一个有状态的websocket服务器。我们需要一段对biz逻辑很重要的只读数据,并将其保存在节点的全局范围内,最近我们必须使此require缓存无效,并重新要求允许在运行时更改此数据段。我的问题是,我们是否应该简单地重新分配全局变量?重新请求的结果将导致在不同阶段读取此数据副本的并发连接之间出现问题?谢谢

全局变量分配在NodeJS上是原子的吗

由于node.js仅以单线程方式运行Javascript,因此所有分配在Javascript中都是原子的

我们是否应该担心仅仅重新分配全局变量,重新请求的结果会导致在不同阶段读取此数据副本的并发连接之间出现问题

你不必担心任务不是原子的


如果一行代码读取此全局变量,并在重新分配给全局变量之前将其值分配给另一个局部变量,则在重新分配后是否会自动刷新此局部变量的值

先前访问过数据的模块是否会在赋值后看到新数据取决于代码的精确细节和变量中的内容。要对您的情况做出具体的评论,您必须向我们展示实际的代码以及在操作中分配的变量中的内容

下面是Javascript中赋值的一般描述。赋值根据变量中的内容做一些不同的事情

 // primitive data value
 let master = 2;

 let x = master;
 console.log(x);     // 2

 master = 10;
 console.log(x);     // still 2
基本体在指定时被复制。仅通过共享指向对象的指针(无复制)来指定对象。因此,任何指向同一对象的指针都将看到该对象上的所有属性更改,因为它们指向完全相同的对象。但是,如果将新对象指定给主变量,则所有其他对象仍将具有指向前一个对象而不是新对象的指针

以下是几个例子来说明:

let master = {name: "John"};

// x gets pointer to the same object that master points to
// both master and x point to the same object
let x = master;
console.log(x.name);    // "John"

// update property on master
// but, both variables point to the same object so both see
// the change in the property value on that object
master.name = "Alice";
console.log(master.name);  // "Alice"
console.log(x.name);       // "Alice"
console.log(x === master); // true, they both point to the same object

// reassign a new object to master variable
master = {name: "Drew"};

// x still points at original object that was originally in master
// and knows nothing about the whole new object in master now
console.log(master.name);  // "Drew" 
console.log(x.name);       // still "Alice", not "Drew"
console.log(x === master); // false, not the same object

原始数据类型(如数字或布尔值)是通过复制分配的,因此在将一个变量的内容分配给另一个变量后,这两个变量之间根本没有连接。每个变量都有自己的数据内容,因此更改一个变量的值不会影响另一个变量的内容

 // primitive data value
 let master = 2;

 let x = master;
 console.log(x);     // 2

 master = 10;
 console.log(x);     // still 2
全局变量分配在NodeJS上是原子的吗

由于node.js仅以单线程方式运行Javascript,因此所有分配在Javascript中都是原子的

我们是否应该担心仅仅重新分配全局变量,重新请求的结果会导致在不同阶段读取此数据副本的并发连接之间出现问题

你不必担心任务不是原子的


如果一行代码读取此全局变量,并在重新分配给全局变量之前将其值分配给另一个局部变量,则在重新分配后是否会自动刷新此局部变量的值

先前访问过数据的模块是否会在赋值后看到新数据取决于代码的精确细节和变量中的内容。要对您的情况做出具体的评论,您必须向我们展示实际的代码以及在操作中分配的变量中的内容

下面是Javascript中赋值的一般描述。赋值根据变量中的内容做一些不同的事情

 // primitive data value
 let master = 2;

 let x = master;
 console.log(x);     // 2

 master = 10;
 console.log(x);     // still 2
基本体在指定时被复制。仅通过共享指向对象的指针(无复制)来指定对象。因此,任何指向同一对象的指针都将看到该对象上的所有属性更改,因为它们指向完全相同的对象。但是,如果将新对象指定给主变量,则所有其他对象仍将具有指向前一个对象而不是新对象的指针

以下是几个例子来说明:

let master = {name: "John"};

// x gets pointer to the same object that master points to
// both master and x point to the same object
let x = master;
console.log(x.name);    // "John"

// update property on master
// but, both variables point to the same object so both see
// the change in the property value on that object
master.name = "Alice";
console.log(master.name);  // "Alice"
console.log(x.name);       // "Alice"
console.log(x === master); // true, they both point to the same object

// reassign a new object to master variable
master = {name: "Drew"};

// x still points at original object that was originally in master
// and knows nothing about the whole new object in master now
console.log(master.name);  // "Drew" 
console.log(x.name);       // still "Alice", not "Drew"
console.log(x === master); // false, not the same object

原始数据类型(如数字或布尔值)是通过复制分配的,因此在将一个变量的内容分配给另一个变量后,这两个变量之间根本没有连接。每个变量都有自己的数据内容,因此更改一个变量的值不会影响另一个变量的内容

 // primitive data value
 let master = 2;

 let x = master;
 console.log(x);     // 2

 master = 10;
 console.log(x);     // still 2

目前还不清楚“在不同阶段读取此单一数据副本”的含义。我认为我们必须看到重新分配数据的代码,然后让您更具体地描述您所关心的内容。NoDE.js运行您的JavaScript单线程,因此没有其他代码在变量赋值中间运行的机会(如在多线程系统中可能存在)。那么工作者线程呢?如果一行代码读取这个全局变量,并在重新分配给全局var之前将其值分配给另一个局部变量,此局部变量的值是否会在重新分配后自动刷新?哪些工作线程?如果您谈论的是浏览器中的webWorkers(不在node.js中),那么他们就不能访问主线程中的共享变量。它们只能通过消息传递共享数据副本来与主线程通信数据。在node.js中没有Javascript工作线程。我指的是“worker_threads”模块支持的工作线程。不清楚“在不同阶段读取此数据的单个副本”是什么意思。我认为我们必须看到重新分配数据的代码,然后让您更具体地描述您所关心的内容。NoDE.js运行您的JavaScript单线程,因此没有其他代码在变量赋值中间运行的机会(如在多线程系统中可能存在)。那么工作者线程呢?如果一行代码读取这个全局变量,并在重新分配给全局var之前将其值分配给另一个局部变量,会