Node.js確實有一個擴展,叫tagg,能夠實現多線程。但其實是這樣的,它的這個多線程只是一個線程池,去執行一部分計算的任務。 node
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),白白浪費了資源。 socket
還有一個問題,若是進程1接受了鏈接A,這個進程就會持有此TCP鏈接,並加入EventLoop。進程2接受了鏈接B。那麼A和B之間能通訊麼?只能說呵呵了。 oop
A和B要通訊,方法也有。1,再用sendmsg把這個socket也發給另外的進程,這個是不可行的,會嚴重加劇驚羣問題。2,使用管道通訊,A將信息經過管道轉發給進程2,進程2再send給鏈接B。這個方案是可行的。但須要用戶本身去作,或者藉助某個框架。 測試
好了,這裏就介紹完了。各位大體明白這個意思就行。我說的也不必定對哦,歡迎各位懂Node.js的同窗來評論。 spa