您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關swoole協程如何實現的內容。小編覺得挺實用的,因此分享給大家做個參考。一起跟隨小編過來看看吧。
Swoole4為PHP語言提供了強大的CSP協程編程模式,用戶可以通過go函數創建一個協程,以達到并發執行的效果,如下面代碼所示:
<?php //Co::sleep()是Swoole提供的API,并不會阻塞當前進程,只會阻塞協程觸發協程切換。 go(function (){ Co::sleep(1); echo "a"; }); go(function (){ Co::sleep(2); echo "b"; }); echo "c"; //輸出結果:cab //程序總執行時間2秒
其實在Swoole4之前就實現了多協程編程模式,在協程創建、切換以及結束的時候,相應的操作php棧即可(創建、切換以及回收php棧)。
此時的協程實現無法完美的支持php語法,其根本原因在于沒有保存c棧信息。(vm內部或者某些擴展提供的API是通過c函數實現的,調用這些函數時如果發生協程切換,c棧該如何處理?)
Swoole4新增了c棧的管理,在協程創建、切換以及結束的同時會伴隨著c棧的創建、切換以及回收。
Swoole4協程實現方案如下圖所示:
其中:
·API層是提供給用戶使用的協程相關函數,比如go()函數用于創建協程;Co::yield()使得當前協程讓出CPU;Co::resume()可恢復某個協程執行;
·Swoole4協程需要同時管理c棧與php棧,Coroutine用于管理c棧,PHPCoroutine用于管理php棧;其中Coroutine(),yield(),resume()實現了c棧的創建以及換入換出;create_func(),on_yield(),on_resume()實現了php棧的創建以及換入換出;
·Swoole4在管理c棧時,用到了 boost.context庫,make_fcontext()和jump_fcontext()函數均使用匯編語言編寫,實現了c棧上下文的創建以及切換;
·Swoole4對boost.context進行了簡單封裝,即Context層,Context(),SwapIn()以及SwapOut()
對應c棧的創建以及換入換出。
感謝各位的閱讀!關于swoole協程如何實現就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。