Node.js是单线程的? 那Async.parallel是如何做到并行执行的?
发布于 7 年前 作者 maxxfire 3979 次浏览 来自 问答

如题,Async.parallel是如何做到并发执行的? 它的并行执行是否有一定的性能消耗?

8 回复

并发是因为网络 IO libuv会根据平台交给 kqueue/epoll/IOCP 去做,文件 IO 会交给libuv自己实现的线程池去做 单线程仅仅只我们编写的代码操作的东西都是在一个线程中:libuv实现的Event Loop中 并发执行肯定有性能消耗,但是这部分性能不算在Event Loop主进程中,详细可以看下图:

untitled2.png

太高深了,不明白这个跟async.parallel有何关系?

是啊,为什么呢?

主进程还是单进程的,并发是异步的io请求在并发。

@maxxfire async.parallel只是一个异步流程控制库,并发和它没关系,它只是负责把你写的一系列异步操作请求发出去,而这些异步请求能够真正的并发实现是我一楼说的那些。 你如果想了解如何实现等到所有异步请求返回后组装好结果再调用最后的回调可以看看async.parallel源代码实现 如果想了解为什么node单线程能实现并发,那么得去看看libuv如何实现event loop

@hyj1991 好的,谢谢。 不过我还想问个问题,如果我想在node.js中创建子线程做一些耗CPU的操作,不知道有没有操作线程的库之类的。

“异步”和“同步”都是指单线程。 异步:如果同一时刻只有一个任务时才不阻塞,可以看作是“伪多线程” 多线程:无论如何都不阻塞 我的比喻可能不太恰当。 所以说,Node中尽量不要出现出现耗时的(CPU运算100ms以上)代码

@maxxfire npm上目前应该没有什么特别好用的操作多线程的库 你真有耗cpu的操作,可以编写c++扩展来解决,因为在扩展下可以直接使用 uv.h,而在 libuv 中是提供了原生的多线程API的:uv_thread_create 和 uv_queue_work 其中 uv_queue_work 启动的子线程还可以和 default loop(node中的主事件循环) 进行通信,是比较推荐的用法

回到顶部