Node.js 如何在NodeJS中实现并发或上下文切换

Node.js 如何在NodeJS中实现并发或上下文切换,node.js,concurrency,context-switch,Node.js,Concurrency,Context Switch,因此,我有一个名为www.example.com/endpoint的API端点,许多设备都在其上发布(我在一家物联网公司工作)。我们已经实现了整个备份节点,并且在从1个设备扩展到“n”个设备时遇到了问题。设备在这个API端点上发布它们的数据包,在这里我执行一段复杂的代码(arnd 1000行),并将设备的状态保存在数据库(mongoDB)中。现在的问题是。每当我收到来自设备1的一个数据包,我正在执行它,在中间,我从设备2得到一个数据包,NodeJS就把设备1执行了,并开始从设备2提供数据包2,当

因此,我有一个名为www.example.com/endpoint的API端点,许多设备都在其上发布(我在一家物联网公司工作)。我们已经实现了整个备份节点,并且在从1个设备扩展到“n”个设备时遇到了问题。设备在这个API端点上发布它们的数据包,在这里我执行一段复杂的代码(arnd 1000行),并将设备的状态保存在数据库(mongoDB)中。现在的问题是。每当我收到来自设备1的一个数据包,我正在执行它,在中间,我从设备2得到一个数据包,NodeJS就把设备1执行了,并开始从设备2提供数据包2,当我放了一个大的控制台。 现在在一个理想的世界里。我希望节点将我当前进度的上下文与数据包1一起保存。然后离开。并继续将数据包2保存在队列中,以便稍后处理。完成数据包1后,我将处理数据包2。
我知道RabbitMQ和kue这样的库用于将其存储在队列中并在以后进行处理,但如何将上下文从一个执行切换到另一个执行?
这是我的想法。还有其他的解决办法。我想听听你对这件事的看法

Q:如何在NodeJ中实现并发或上下文切换

A:简短回答:不可能。因为Javascript是单线程的


Q:现在问题是。每当我从设备1接收到一个数据包,我正在执行它,在中间,我从设备2得到一个数据包,NodeJS就把设备1执行了,并开始从设备2提供数据包2,当我放了一个大的控制台。 A:正如您可能已经在许多地方读到的那样,
NodeJS
基于事件驱动模型,该模型对I/O是无阻塞的

节点似乎中途放弃了
device1
来服务
device2
的原因是
device1
的代码已经被处理,直到它正在等待
异步函数
回调为止。例如,执行数据库写入。因此,在它可用的同时,它继续提供服务
device2

device2的类似情况
——一旦它遇到一个
async
函数,事件被推送到事件队列中,等待返回<如果返回响应,则代码>节点可能返回到设备1。也可能是其他设备,
deviceen

我们说NodeJS是非阻塞的,因为
节点
进程不会为一个单独的响应锁定整个web应用程序。相反,它会继续并从队列中选择下一个事件(本质上是一个代码块)来运行它。因此它总是很忙,除非事件队列上确实没有可用的内容


Q:我知道RabbitMQ和kue这样的库可以将其存储在队列中并在以后进行处理,但如何从一个执行切换到另一个执行

A: 如前所述。截至2016年,Javascript仍然无法执行线程。NodeJS不是为繁重的计算工作而设计的,它应该只关注于服务请求,因此代码最好是轻量级和非阻塞的。基本上,您希望通过使用异步函数包装调用,将那些繁重的I/O任务(如写入文件或数据库或向其他进程发出HTTP请求(网络))留给其他进程

NodeJS不是一种银弹技术。如果您的应用程序需要在事件线程上执行大量计算工作,那么
Node
可能不是一个好的技术选择,但它不是世界末日,因为您可以将自己的子进程用于繁重的计算工作

请参见:


您可能还想考虑一个可选的代码,如<代码> java < /> >,它有<代码> NiO和线程> /Cuff>。它是纯计算的,还是涉及(大量)I/O,比如数据库/文件/网络交互?Node可以很好地处理大量并发I/O。它涉及大量回调…假设这意味着“大量I/O”,我认为可能是其他原因导致了您的问题。@robertklep API没有回到其原始点。可能是因为它无法处理新的IO,而且节点在后台的线程数量有限。系统需要一个同步函数,如async.瀑布,该函数具有类似队列的功能。我想我得写下来。将需要一些时间和精力。节点不会“中断”挂起的I/O请求。它们可能会排队,但不会中断,节点也不会失去对它们的跟踪。我认为这是你的代码中的一个问题,但是如果你的问题中没有任何代码,我就不能说你应该从哪里开始寻找。