看了韓天峯PHP 協程:Go + Chan + Defer的文章,以爲swoole大大下降了協程的開發門檻,同時提供了php yield原生協程不具有的功能,嘗試着寫一些簡單的例子。php
協程是協做式任務(用戶來決定控制流),相對的是搶佔式任務(例如cpu來調度資源)。
簡單點說,協程的精髓就是控制流的讓出與恢復。ubuntu
ubuntu18.04.1 LTS
php7.3.0
swoole4.2.10segmentfault
<?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