Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 递增/递减操作在NodeJ中是线程安全的吗?_Node.js_Multithreading - Fatal编程技术网

Node.js 递增/递减操作在NodeJ中是线程安全的吗?

Node.js 递增/递减操作在NodeJ中是线程安全的吗?,node.js,multithreading,Node.js,Multithreading,我有一个简单的api,用户可以向它发送一些数据。数据是对象的JSON数组。我的目标是了解api当前正在处理多少对象。我创建了一个全局计数器,对于收到的每个请求,我将对象的数量添加到该计数器中,当我处理完对象后,我从计数器中扣除该数量。我的问题是,这种方法是线程安全的吗?也就是说,我可以有两个请求吗?一个是刚刚处理完毕的请求,以便进行扣减,另一个是新请求,我将请求数添加到计数器中,类似于竞争条件?如果一台服务器上运行一个应用程序,您不应该知道。 例如 const counter = 0 rout

我有一个简单的api,用户可以向它发送一些数据。数据是对象的JSON数组。我的目标是了解api当前正在处理多少对象。我创建了一个全局计数器,对于收到的每个请求,我将对象的数量添加到该计数器中,当我处理完对象后,我从计数器中扣除该数量。我的问题是,这种方法是线程安全的吗?也就是说,我可以有两个请求吗?一个是刚刚处理完毕的请求,以便进行扣减,另一个是新请求,我将请求数添加到计数器中,类似于竞争条件?

如果一台服务器上运行一个应用程序,您不应该知道。 例如

const counter = 0

router.get("/", (req, res) => {
  counter++
  res.send({counter: counter})
})

即使在并发请求期间,计数器也会按预期计数请求,因为Node JS是单线程的,并且会关心它。但是,如果您有多台服务器,该方法将不起作用,因为全局变量存储在每个服务器的RAM中。在这种情况下,您应该有一些联合数据库(它是一个键值数据库,它将数据存储在RAM中,因此速度非常快)来存储计数器

Node.js是单线程的(即使使用web workers,每个解释器都是单线程的),因此不必担心线程安全性。只是澄清一下,如果我有两个传入请求,它们会一个接一个地输入代码。它们不能同时接触相同的全局元素?正确-它们永远不会同时接触我使用AWS负载平衡器,它反过来将请求定向到两台服务器中的一台,并且每台服务器在开始运行时执行fork()(fork create 4进程)。我猜每个进程都有自己的计数器,对于正在处理的请求数,我说的对吗?不,您有多个服务器,每个服务器都有自己的计数器。NodeJS最大的优点是,您可以拥有全局变量,但它们存储在RAM中,当您的NodeJS应用程序终止时,您将丢失这些数据,为了避免这种情况,您可以使用Redis。它也存储在RAM中,但它会同步硬盘上的所有数据。在您的情况下,您应该使用Redis数据库进行计数,两台服务器都应该增加Redis中的数据。此外,我想提到的是,Redis DB中的所有查询都是原子查询