如何在node.js中完成繁重的处理操作

Sus*_*pta 6 image-processing node.js

我有大量的数据处理操作,每个10-12个模拟请求都需要完成。我已经读到,对于更高级别的并发,Node.js是一个很好的平台,它通过具有非阻塞事件循环来实现。

我所知道的是,有像查询数据库的东西,我可以激活一个事件到一个单独的进程(如mongodmysqld),然后有一个回调,这将处理来自该进程的结果。很公平。

但是,如果我想在回调中进行大量计算,该怎么办?在该回调中的代码完全执行之前,它不会阻止其他请求。例如,我想处理高分辨率图像,而我拥有的代码在Javascript本身(no separate用于图像处理的过程)中。

我想到的实现方式就像

get_image_from_db(image_id, callback(imageBitMap) {
    heavy_operation(imageBitMap); // Can take 5 seconds.
});
Run Code Online (Sandbox Code Playgroud)

heavy_operation在那5秒钟内,该节点将停止接收任何请求吗?还是我在思考执行此类任务的错误方法。请指导,我是JS新手。

更新

或者就像我可以处理部分图像并使事件循环返回以接受其他回调并返回到处理该部分图像一样。(类似于对事件进行优先级排序)。

Nic*_*son 5

是的,因为回调函数在主循环中执行,所以它将阻止它。只有异步调用的函数不会阻塞循环。据我了解,如果您希望图像处理异步执行,则必须使用单独的进程来执行。

请注意,您可以编写自己的异步过程来处理它。首先,您可以阅读如何为Node.js编写异步函数的答案。

更新

如何在node.js中创建非阻塞异步函数?也许也值得一读。这个问题实际上是在我链接的另一个问题中引用的,但我想为了简单起见将其包含在这里。

  • 是的,它将创建 15 个进程,据我所知你不能在 Node.js 中创建线程。它有一个线程,这是您的主事件循环。另一种选择是编写一个单独的 Node 工作应用程序,它对通过消息传递队列(RabbitMQ 或其他东西)传递给它的任务进行图像处理。然而,这只会同步处理图像(一次一个)。如果您希望同时处理它们,则必须创建单独的进程。 (2认同)