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

swoole協程怎樣實現

Dec 10, 2019 pm 04:20 PM
swoole 協程 實現

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

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
2 週前 By 尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
2 週前 By 尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱門文章標籤

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

華為手機如何實現雙微信登入? 華為手機如何實現雙微信登入? Mar 24, 2024 am 11:27 AM

華為手機如何實現雙微信登入?

如何在華為手機上實現微信分身功能 如何在華為手機上實現微信分身功能 Mar 24, 2024 pm 06:03 PM

如何在華為手機上實現微信分身功能

golang函數與goroutine的父子關係 golang函數與goroutine的父子關係 Apr 25, 2024 pm 12:57 PM

golang函數與goroutine的父子關係

swoole協程如何在laravel使用 swoole協程如何在laravel使用 Apr 09, 2024 pm 06:48 PM

swoole協程如何在laravel使用

swoole和workerman哪個好 swoole和workerman哪個好 Apr 09, 2024 pm 07:00 PM

swoole和workerman哪個好

並發和協程在Golang API設計中的應用 並發和協程在Golang API設計中的應用 May 07, 2024 pm 06:51 PM

並發和協程在Golang API設計中的應用

swoole_process 怎麼讓使用者切換 swoole_process 怎麼讓使用者切換 Apr 09, 2024 pm 06:21 PM

swoole_process 怎麼讓使用者切換

swoole和java哪個表現好 swoole和java哪個表現好 Apr 09, 2024 pm 07:03 PM

swoole和java哪個表現好

See all articles