1. 云栖社区>
  2. 技术文集>
  3. 列表>
  4. 正文

Node.js异步处理CPU密集型任务的新思路

作者:用户 来源:互联网 时间:2016-06-24 17:22:30

耗时计算线程cpuuv进程处理c++互联网异步请求wpf主进程通知任务一个子线程执行完毕Node.js模块封装Node.js操作数据库node.js阻塞

Node.js异步处理CPU密集型任务的新思路 - 摘要: 本文讲的是Node.js异步处理CPU密集型任务的新思路, Node.js擅长数据密集型实时(data-intensive real-time)交互的应用场景。然而数据密集型实时应用程序并不是只有I/O密集型任务,当碰到CPU密集型任务时,比如要对数据加

Node.js擅长数据密集型实时(data-intensive real-time)交互的应用场景。然而数据密集型实时应用程序并不是只有I/O密集型任务,当碰到CPU密集型任务时,比如要对数据加解密(node.bcrypt.js),数据压缩和解压(node-tar),或者要根据用户的身份对图片做些个性化处理,在这些场景下,主线程致力于做复杂的CPU计算,I/O请求队列中的任务就被阻塞。

Node.js主线程的event loop在处理所有的任务/事件时,都是沿着事件队列顺序执行的,所以在其中任何一个任务/事件本身没有完成之前,其它的回调、监听器、超时、nextTick()的函数都得不到运行的机会,因为被阻塞的event loop根本没机会处理它们,此时程序最好的情况是变慢,最糟的情况是停滞不动,像死掉一样。

一个可行的解决方案是新开进程,通过IPC通信,将CPU密集型任务交给子进程,子进程计算完毕后,再通过ipc消息通知主进程,并将结果返回给主进程。

和创建线程相比,开辟新进程的系统资源占用率大,进程间通信效率也不高。如果能不开新进程而是新开线程,将CPU耗时任务交给一个工作线程去做,然后主线程立即返回,处理其他的I/O请求,等到工作线程计算完毕后,通知主线程并将结果返回给主线程。那么在同时面对I/O密集型和CPU密集型服务的场景下,Node的主线程也会变得轻松,并能时刻保持高响应度。

因此,和开进程相比,一个更加优秀的解决方案是:

不开进程,而是将CPU耗时操作交给进程内的一个工作线程完成。

CPU耗时操作的具体逻辑支持通过C++和JS实现。

JS使用这个机制与使用I/O库类似,方便高效。

在新线程中运行一个独立的V8 VM,与主线程的VM并发执行,并且这个线程必须由我们自己托管。

为了实现以上四个目标,我们在Node中增加了一个backgroundthread线程,文章稍候会详细解释这个概念。在具体实现上,为Node增加了一个pt_c的内建C++模块。这个模块负责把CPU耗时操作封装成一个Task,抛给backgroundthread,然后立即返回。具体的逻辑在另一个线程中处理,完成之后,设定结果,通知主线程。这个过程非常类似于异步I/O请求。具体逻辑如下图:

Node.js异步处理CPU密集型任务的新思路-nodejs 计算密集型

Node提供了一种机制可以将CPU耗时操作交给其他线程去做,等到执行完毕后设置结果通知主线程执行callback函数。以下是一段代码,用来演示这个过程:

int main() {
  loop = uv_default_loop();
  int data[FIB_UNTIL];
  uv_work_t req[FIB_UNTIL];
  int i;
  for (i = 0; i < FIB_UNTIL; i++) {
    data[i] = i;
    req[i].data = (void *) &data[i];
    uv_queue_work(loop, &req[i], fib, after_fib);
  }
  return uv_run(loop, UV_RUN_DEFAULT);
}
  

其中函数uv_queue_work的定义如下:

UV_EXTERN int uv_queue_work(uv_loop_t* loop,
    uv_work_t* req,
    uv_work_cb work_cb,
    uv_after_work_cb after_work_cb);
  

以上是云栖社区小编为您精心准备的的内容,在云栖社区的博客、问答、公众号、人物、课程等栏目也有 的相关内容,欢迎继续使用右上角搜索按钮进行搜索耗时计算 , 线程 , cpu , uv , 进程 , 处理 , c++互联网异步 , 请求wpf主进程通知 , 任务 , 一个 , 子线程执行完毕 , Node.js模块封装 , Node.js操作数据库 node.js阻塞 nodejs 计算密集型、cpu密集型 io密集型、io密集型和cpu密集型、cpu密集型、cpu密集型应用,以便于您获取更多的相关知识。

node js-node.js到底怎么样,它的劣势在哪里呢

...的服务器,无须做复杂的配置。 4.nodejs基于事件驱动,异步回调机制,适合大并发量的请求。 5.nodejs社区非常活跃,有很多成熟的套件可以使用,而且还在持续更新。 当然,优点还有很多,这里简单列举几条。下面说说个人...

nodejs中实现阻塞实例_node.js

...例如IO。如果现在node.js遭受大量请求,而这些请求都是IO密集型的,那么此时node每接受一个请求,在遇到耗时较长的IO操作时,javascript线程并不会一直在此等待,而是交出控制,在回调堆栈里添加IO操作完成后要执行的操作(当...

Node.js入门基础介绍

...变得轻微和高效,非常适合构建运行在分布式设备的数据密集型实时应用。 Node.js能做什么以前JavaScript并不涉及什么逻辑代码,但是node的出现使得JavaScript能做一些负责的逻辑代码 JavaScript为客户端而生,node为网络而生 异步方...

paip.最好的脚本语言node js 环境搭建连接mysql

...还没建立9 14. 没默认调试ide支持9 15. 缺点:1. 不适合CPU密集型应用;9 16. 2. 只支持单核CPU,不能充分利用CPU9 17. 3. 可靠性低,一旦代码某个环节崩溃,整个系统都崩溃9 18. 4. 开源组件库质量参差不齐,更新快,向下不兼容...

文章: Node.js异步处理CPU密集型任务的新思路

Node.js擅长数据密集型实时(data-intensive real-time)交互的应用场景。然而数据密集型实时应用程序并不是只有I/O密集型任务,当碰到CPU密集型任务时,比如要对数据加解密(node.bcrypt.js),数据压缩和解压(node-tar),或者要根据...

前三篇
后三篇