swoole協程入門

看了韓天峯PHP 協程:Go + Chan + Defer的文章,以爲swoole大大下降了協程的開發門檻,同時提供了php yield原生協程不具有的功能,嘗試着寫一些簡單的例子。php

前言:協程是什麼?

協程是協做式任務(用戶來決定控制流),相對的是搶佔式任務(例如cpu來調度資源)。
簡單點說,協程的精髓就是控制流的讓出與恢復。ubuntu

環境:

ubuntu18.04.1 LTS
php7.3.0
swoole4.2.10segmentfault

看例子:simple_co.php

<?php
// simple co
function t1() {
    Co::sleep(0.05);
    echo __METHOD__.PHP_EOL;
}

function t2() {
    Co::sleep(0.05);
    echo __METHOD__.PHP_EOL;
}

function t3() {
    Co::sleep(0.05);
    echo __METHOD__.PHP_EOL;
}


go("t1");
go("t2");
go("t3");

$ time php simple_co.php  # 執行時間在0.07s左右

分析

這個簡單的例子,定義了三個任務(t1/t2/t3),經過短名稱go來運行三個任務。
運行過程以下:
t1執行,遇到Co::sleep,主動讓出控制流,t1暫停(等待Co::sleep結束後恢復執行)
t2執行,相似t1狀況,暫停
t3執行,相似t1狀況,暫停
沒有其餘程序了,3個協程的執行都處於暫停狀態
...0.05s後...
協程上t1的sleep先結束,恢復執行t1
t2/t3的恢復執行相似t1
而後整個程序結束swoole

特別說明
t1/t2/t3的恢復執行並不是嚴格按照掛起順序恢復(本地測試中恢復執行順序是t1/t3/t2)
恢復執行沒有肯定的順序
適用於無序、獨立的任務並行執行php7

總結

這個例子,主要來描述控制流的讓出和恢復執行,這也是協程的精髓。
固然,程序的實現依賴於swoole的封裝,感謝swoole!測試

其餘
若是同時安裝了xdebug擴展,在運行協程代碼時,會直接提示"Warning: go(): Using Xdebug in coroutines is extremely dangerous, please notice that it may lead to coredump!",這種提示方式有點過於強硬,能夠在xdebug分析時給出提示,有逼迫用戶二選一的嫌疑。debug

相關文章
相關標籤/搜索