swoole協(xié)程怎樣實現(xiàn)

swoole協(xié)程怎樣實現(xiàn)

swoole4為php語言提供了強(qiáng)大的CSP協(xié)程編程模式,用戶可以通過go函數(shù)創(chuàng)建一個協(xié)程,以達(dá)到并發(fā)執(zhí)行的效果,如下面代碼所示:

<?php //Co::sleep()是Swoole提供的API,并不會阻塞當(dāng)前進(jìn)程,只會阻塞協(xié)程觸發(fā)協(xié)程切換。 go(function (){     Co::sleep(1);     echo "a"; }); go(function (){     Co::sleep(2);     echo "b"; }); echo "c"; //輸出結(jié)果:cab //程序總執(zhí)行時間2秒

其實在Swoole4之前就實現(xiàn)了多協(xié)程編程模式,在協(xié)程創(chuàng)建、切換以及結(jié)束的時候,相應(yīng)的操作php即可(創(chuàng)建、切換以及回收php棧)。

此時的協(xié)程實現(xiàn)無法完美的支持php語法,其根本原因在于沒有保存c棧信息。(vm內(nèi)部或者某些擴(kuò)展提供的API是通過c函數(shù)實現(xiàn)的,調(diào)用這些函數(shù)時如果發(fā)生協(xié)程切換,c棧該如何處理?)

Swoole4新增了c棧的管理,在協(xié)程創(chuàng)建、切換以及結(jié)束的同時會伴隨著c棧的創(chuàng)建、切換以及回收。

Swoole4協(xié)程實現(xiàn)方案如下圖所示:

swoole協(xié)程怎樣實現(xiàn)

其中:

·API層是提供給用戶使用的協(xié)程相關(guān)函數(shù),比如go()函數(shù)用于創(chuàng)建協(xié)程;Co::yield()使得當(dāng)前協(xié)程讓出CPU;Co::resume()可恢復(fù)某個協(xié)程執(zhí)行;

·Swoole4協(xié)程需要同時管理c棧與php棧,Coroutine用于管理c棧,PHPCoroutine用于管理php棧;其中Coroutine(),yield(),resume()實現(xiàn)了c棧的創(chuàng)建以及換入換出;create_func(),on_yield(),on_resume()實現(xiàn)了php棧的創(chuàng)建以及換入換出;

·Swoole4在管理c棧時,用到了 boost.context庫,make_fcontext()和jump_fcontext()函數(shù)均使用匯編語言編寫,實現(xiàn)了c棧上下文的創(chuàng)建以及切換;

·Swoole4對boost.context進(jìn)行了簡單封裝,即Context層,Context(),SwapIn()以及SwapOut()

對應(yīng)c棧的創(chuàng)建以及換入換出。

?PHP中文網(wǎng),有大量免費的Swoole入門教程,歡迎大家學(xué)習(xí)!

以上就是

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點贊9 分享