如何在NodeJS

时间:2016-07-18 22:25:45

标签: node.js concurrency context-switch

所以我有一个名为www.example.com/endpoint的API端点,其上发布了很多设备(我在IOT公司工作)。我们已经在NodeJS中实现了我们的全部支持,并且在从1个设备扩展到' n'设备数量。设备在此API端点发布其数据包,从中执行复杂的代码(arnd 1000行)并将设备状态保存在数据库(mongoDB)中。现在的问题是。每当我收到来自设备1的数据包并且我正在执行它时,我从中间获得设备2的数据包,NodeJS使设备1按原样执行并开始从设备2提供数据包2,当我放置时,我看到了这一点广泛的console.log()语句
现在处于一个理想的世界。我希望Node用数据包1保存当前进度的上下文然后离开。并继续将数据包2保存在队列中以便稍后处理。一旦我完成了数据包1,我将接收数据包2并处理它 我知道像RabbitMQ和kue这样的库将它存储在队列中并稍后处理它,但是我如何从一个执行转换到另一个执行?
这是我的思维方式。也可能有其他解决方案。想听听你对此事的看法。

1 个答案:

答案 0 :(得分:2)

问: 如何在NodeJS中实现并发或上下文切换。

答:简答:可能。因为Javascript是单线程的。


问: 现在的问题是。每当我收到来自设备1的数据包并且我正在执行它时,我从中间获得设备2的数据包,NodeJS使设备1按原样执行并开始从设备2提供数据包2,当我放置时,我看到了这一点广泛的console.log()语句

答:正如您可能已经在许多地方看到NodeJS基于事件驱动的模型,该模型对I / O没有阻塞。

Node似乎放弃device1中途服务device2的原因是因为device1的代码已经处理完毕,直到等待asynchronous function {1}}回调。例如。执行数据库写入。因此,当它可用时,它继续服务device2

device2的类似情况 - 一旦它遇到async函数,其中事件被推入事件队列,等待返回。如果回复,Node可能会返回device1。或者它可能是其他设备,deviceN

我们说NodeJS是非阻塞的,因为node进程没有锁定整个Web应用程序以获得唯一的响应。相反,它继续从队列中选择下一个事件(实质上是一段代码)来运行它。因此它会一直很忙,除非事件队列中没有任何可用的东西。


问:我知道像RabbitMQ和kue这样的库将它存储在队列中并稍后处理它,但是我如何从一个执行转换到另一个执行?

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

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

查看: https://nodejs.org/api/child_process.html

您可能还想考虑具有JavaNIO功能的Threading替代方案。