1 回答

TA貢獻(xiàn)1777條經(jīng)驗(yàn) 獲得超10個(gè)贊
多核并行
node.js的event loop是單進(jìn)程單線程的,只有一個(gè)epoll/kqueue事件輪詢被執(zhí)行。所以無法利用到多核的計(jì)算優(yōu)勢(shì)。
swoole的event loop是多線程的,是基于epoll/kqueue的Multi-Reactor模型。這點(diǎn)與nginx/golang相同。另外swoole的多線程Reactor之間不存在鎖,這點(diǎn)與nginx不同。它啟用了專門的accept線程,類似與JAVA的netty。
所以在多核CPU的機(jī)器上,node.js對(duì)網(wǎng)絡(luò)IO事件的處理能力絕對(duì)是要差swoole數(shù)倍的,在4核的機(jī)器上至少要查2-3倍。
雖然node.js也提供了多線程的擴(kuò)展,但對(duì)于event_loop來說必須是內(nèi)核提供,擴(kuò)展不行的。
另外node.js未來是否會(huì)改造成為多線程Reactor,我估計(jì)不會(huì),這不是技術(shù)上的難題。而是一旦改成多線程Reactor,node.js恐怕就不是node.js了。失去了原來單線程的各種優(yōu)勢(shì)后,反而會(huì)一無是處。當(dāng)然可能node.js官方開發(fā)組會(huì)思考出解決問題的巧妙辦法,一切都是后話了。
不只是event_loop,執(zhí)行用戶層代碼是也是單線程的,不能利用多核計(jì)算優(yōu)勢(shì)。需要用戶自己去fork多進(jìn)程或者創(chuàng)建線程池。使用難度增加了很多。不像swoole,配置一下參數(shù)即可,是天然多進(jìn)程。
異步網(wǎng)絡(luò)IO
node.js和swoole都是基于epoll/kqueue實(shí)現(xiàn)的全異步非阻塞IO,所以這方面大同小異,沒有差別。維持TCP長(zhǎng)連接的能力是一樣的。
node.js在這里有一個(gè)優(yōu)勢(shì)就是它支持windows的IOCP。swoole僅支持Linux/FreeBSD/MacOS的epoll/kqueue.
異步文件讀寫
node.js和swoole都提供了基于線程池的異步文件讀寫,DNS查詢功能。node.js最早基于libeio實(shí)現(xiàn),后來才自行實(shí)現(xiàn)線程池。swoole一開始就基于線程池設(shè)計(jì)的。
實(shí)際上這里都是通過多線程阻塞來模擬的,并非真正的異步讀寫文件。比如同時(shí)讀寫數(shù)百個(gè)文件時(shí),性能遠(yuǎn)不如普通的多進(jìn)程PHP程序。
swoole中還提供了Linux Native AIO的支持,是真正的內(nèi)核層異步并行文件讀寫,不過需要通過修改宏開關(guān),重新編譯才可以使用。
最后結(jié)論
node.js和swoole比沒有明顯優(yōu)勢(shì),僅在Windows支持方面比swoole要好。node.js中有的特性swoole中都有。個(gè)人認(rèn)為Node.js最大的優(yōu)勢(shì)在于:
node.js使用JavaScript語言,與瀏覽器、HTML之間的融合度非常高,使用同一種語言既寫前端又寫后端
支持Windows平臺(tái),利用node-webkit,可以開發(fā)PC客戶端軟件
node.js的定位應(yīng)該是前端與后端結(jié)合非常緊密的應(yīng)用場(chǎng)景。如websocket推送,JSON-RPC,輕量級(jí)HTTP接口。
而對(duì)于真正專業(yè)的后端領(lǐng)域,分布式系統(tǒng),node.js不適合。
- 1 回答
- 0 關(guān)注
- 1385 瀏覽
添加回答
舉報(bào)