看到有网友说Node.js是支持多线程的,我在这里解释一下

原创
2014/07/11 21:49
阅读数 9K

Node.js确实有一个扩展,叫tagg,可以实现多线程。但实际上是这样的,它的这个多线程只是一个线程池,去执行一部分计算的任务。

EventLoop和IO的处理部分始终是单线程的,在任务线程中不能调用异步接口,只能计算或者执行阻塞IO。

除了tagg之外,Node.js还有child_process,cluster等扩展可以实现多进程。但这里的多进程也不知真正意义上的子进程。而是node的另外一个实例。它无法继承使用父进程的任何资源。

注:有好多同学说,单线程EventLoop足够用了。各位可以写个简单的程序测试看下,单线程EventLoop+EchoTCP和多线程程序在多核机器上有没有差距。

比如父进程中监听了一个端口,那么使用child_process创建了子进程后,实际上是没有这个server socket的。Node.js用了比较奇特的方式,通过sendmsg系统调用将这个socket的控制栈发过来了,子进程才能操作这个socket。

呵呵,问题又来了。相同的socket如果加入了不同的EventLoop中会发生惊群(epoll_wait all return)。一旦有请求进入(connect),那操作系统会唤醒所有子进程。只有1个进程最后会成功(accept),其他的进程都会失败(errno=EAGAIN),白白浪费了资源。

还有一个问题,如果进程1接受了连接A,这个进程就会持有此TCP连接,并加入EventLoop。进程2接受了连接B。那么A和B之间能通信么?只能说呵呵了。

A和B要通信,方法也有。1,再用sendmsg把这个socket也发给另外的进程,这个是不可行的,会严重加重惊群问题。2,使用管道通信,A将信息通过管道转发给进程2,进程2再send给连接B。这个方案是可行的。但需要用户自己去做,或者借助某个框架。

好了,这里就介绍完了。各位大致明白这个意思就行。我说的也不一定对哦,欢迎各位懂Node.js的同学来评论。


展开阅读全文
打赏
1
13 收藏
分享
加载中
1、你说你熟悉nodejs的底层,你到底有没有单步调试过node??惊群不是每个进程都会唤醒好吗??是部分进程,请测试好了再出来说好吗?
2、A进程要给B进程某个客户端发消息用你第二种方法就行了,为什么会有方法一?既然两个客户端分配在不同的进程,当然A进程不会去直接对B进程的连接进行读写,不然还分什么?
2014/07/28 13:50
回复
举报
matyhtf博主

引用来自“朴灵”的评论

tagg扩展是用来做密集计算的。跟IO没有半毛钱关系。
我也说了的就是做计算任务。
2014/07/28 11:38
回复
举报
matyhtf博主

引用来自“朴灵”的评论

A和B是两个不同的socket。为什么需要互相通信?
如果是聊天软件,A向B发消息。这不就需要了么。
2014/07/28 11:37
回复
举报
matyhtf博主

引用来自“朴灵”的评论

惊群问题,linux早就解决了好么。
如果2个进程同时在read同一个fd,Linux是可以解决惊群的,它只会唤醒1个进程。 如果2个进程每个进程的epoll中都有同一个fd,Linux会唤醒所有进程。
2014/07/28 11:37
回复
举报
tagg扩展是用来做密集计算的。跟IO没有半毛钱关系。
2014/07/26 22:33
回复
举报
A和B是两个不同的socket。为什么需要互相通信?
2014/07/26 22:31
回复
举报
惊群问题,linux早就解决了好么。
2014/07/26 22:30
回复
举报
matyhtf博主

引用来自“鱼说还休”的评论

不过要试一试
对,耳听为虚,眼见为实。一切都要测试才知道结果。
2014/07/12 10:57
回复
举报
不过要试一试
2014/07/12 08:46
回复
举报
听懂了,多谢楼主
2014/07/12 08:33
回复
举报
更多评论
打赏
10 评论
13 收藏
1
分享
返回顶部
顶部