首頁 >php框架 >Swoole >swoole協程怎樣實現

swoole協程怎樣實現

爱喝马黛茶的安东尼
爱喝马黛茶的安东尼原創
2019-12-10 16:20:022871瀏覽

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協程實作方案如下圖所示:

swoole協程怎樣實現

其中:

·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堆疊的建立以及換入換出。

 PHP中文網,有大量免費的Swoole入門教學,歡迎大家學習!

以上是swoole協程怎樣實現的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn