對比swoole和workerman,進程模型有什么不同?


這個社會,你要出去找工作說不會點兒workerman或者swoole,真是不好意思說自己是混php圈子的。swoole是使用C語言實現的socket通信框架,workerman則是使用純php實現的socket框架,二者進程模型上也存在很多的不同。

先說下swoole的進程模型,當然了,我先盜張圖貼一下。

  • master進程
    這個進程比較復雜,也是我認為最核心的進程,這是一個包含多線程的進程,分別是一個主線程和n個reactor線程(數量可以配置)。其中,主線程用於accept新的連接,然后評估一下每個reactor線程負責維護的連接數,然后分配給數量最少的那個reactor線程,最大程度保證每個reactor線程的負載量是均衡的。本質上講,一旦一個socket可讀或者可寫了,就由reactor線程發送給worker進程或者發送會客戶端。除此之外,主線程還負責對所有信號的接管,避免reactor線程收到信號的打擾中斷。說的洋氣點兒就是:master進程負責了連接的accept、托管、socket的可讀可寫(數據的發送和接受),本質上講,master進程負責了IO。還需要注意一點兒的是reactor線程是徹底的全異步非阻塞工作方式。

  • manager進程
    manager進程是worker進程和taskworker進程的媽,說的洋氣點兒就是manager進程fork出來了worker進程和taskworker進程,生出來了就得管,所以,manager進程得負責對worker進程和taskworker進程的撫養義務,具體包括監控它們的狀態、當它們意外掛了后重新拉起一個新的進程(避免了僵屍進程)、平滑重啟(就是傳說中的reload)。

  • worker進程
    worker進程是manager進程fork出來的,這個進程說白了就是搬磚干活(官方文檔中屢次提到的業務代碼),其實就是平時碼的那些curd業務邏輯代碼,懂了吧?只不過worker進程比較diao的是,這個進程可以用異步方式去工作,也可以用同步方式去工作。如果聽不懂什么意思,那就先背過,先混個臉熟再說。

  • taskworker進程
    taskworker進程(后文中稱tasker進程)實際本質上也是worker進程,只不過是一種特殊的worker進程。如果你的worker進程中存在一些耗時耗力的操作,那么可以先拋給tasker進程,自己先去干別的,等tasker干完了,再由worker進程取回,非常diao。但是tasker進程只能工作在同步方式下,並不能使用異步。這就是為什么tasker進程不可以使用定時器,而worker進程可以使用定時器的原因。

簡單總結混在一起說下這幾種進程之間是怎么搭配起來干活的。見說來說,就是master進程就是接活兒的銷售,但是具體干活則由worker進程來做,如果worker進程感覺到某些流程太繁忙復雜就可以讓tasker進程來做。而manager進程就是后勤worker進程和takser進程的人力資源保障部,負責他們的生死存亡和吃喝拉撒。

而workerman的進程模型相對就要簡單很多了,首先相對於swoole來說,workerman沒有swoole中的reator線程,其次workerman沒有用於處理普通業務的worker進程以及tasker進程。而workerman的話,socket是由worker進程負責的,swoole中則是由主進程中的reactor線程來負責的。而swoole在接受到數據后,可以通過自己的worker進程來處理業務(有點兒類似於fpm進程)。

當我們業務代碼以同步阻塞方式來使用swoole和workerman的時候,swoole則很想nginx+fpm的二合一體,而workerman則只相當於nginx

 

轉:https://t.ti-node.com/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM