微吼云上線多路互動直播服務 加速多場景互動直播落地
779
2025-03-31
關于進程、線程、協程,有非常詳細和豐富的博客或者學習資源,我不在此做贅述,我大致在此介紹一下這幾個東西。
1.進程擁有自己獨立的堆和棧,既不共享堆,亦不共享棧,進程由操作系統調度。
2.線程擁有自己獨立的棧和共享的堆,共享堆,不共享棧,線程亦由操作系統調度(標準線程是的)。
3.協程和線程一樣共享堆,不共享棧,協程由程序員在協程的代碼里顯示調度。
PHP中的協程實現基礎 yield
yield的根本實現是生成器類,而迭代器類是迭代器接口的實現:
Generator?implements?Iterator?{
public?mixed?current?(?void?) // 返回當前產生的值
public?mixed?key?(?void?) // 返回當前產生的鍵
public?void?next?(?void?) // 生成器繼續執行
public?void?rewind?(?void?) // 重置迭代器,如果迭代已經開始了,這里會拋出一個異常。
// renwind的執行將會導致第一個yield被執行, 并且忽略了他的返回值.
public?mixed?send?(?mixed?$value?) // 向生成器中傳入一個值,并且當做?yield?表達式的結果,然后繼續執行生成器。如果當這個方法被調用時,生成器
// 不在?yield?表達式,那么在傳入值之前,它會先運行到第一個?yield?表達式。
public?void?throw?(?Exception?$exception?) // 向生成器中拋入一個異常
public?bool?valid?(?void?) // 檢查迭代器是否被關閉
public?void?__wakeup?(?void?) // 序列化回調,拋出一個異常以表示生成器不能被序列化。
}
以上解析可以參考PHP官方文檔。
http://php.net/manual/zh/clas...
以及鳥哥翻譯的這篇詳細文檔:
http://www.laruence.com/2015/...
我就以他實現的協程多任務調度為基礎做一下例子說明并說一下關于我在阻塞方面所做的一些思考。
自定義簡單定時執行任務示例:
(此例子必須依賴于以上鳥哥實現的協程調度代碼)
class timer {
private $start = 0; // 定時開始時間
private $timer; // 間隔的時間差,單位秒
private $value = 0; // 產生的結果值
private $callback; // 異步回調
private $isEnd = false; // 當前定時器任務是否結束
public function __construct($timer,callable $callback)
{
$this->start = time();
$this->timer = $timer;
$this->callback = $callback;
}
public function run() {
if($this->valid()) {
$callback?= $this->callback;
$callback($this->value ++,$this);
$this->start = time();
}
}
/**
*?定時執行檢查
*/
public function valid() {
$end
任務調度
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。