簡介
最近學習 swoole 接觸到協程,記錄一下我理解到的協程。
文章比較白話,而且目前理解的還非常淺,寫出自己的想法,請大佬們多多指點。
協程協程可以簡單理解為執行緒,只不過這個執行緒是使用者態的,不需要作業系統參與,建立銷毀和切換的成本非常低,和執行緒不同的是協程沒法利用多核 cpu 的,想利用多核 cpu 需要依賴 swoole 的多程序模型。—— swoole 協程一章
我的理解
可以把協程看成一道小學數學的一道題目:「合理安排時間」,來我們先做一道題目:
小明下班後回家煮飯,煲湯需要 10 分鐘,煮飯需要 8 分鐘, 炒菜需要 5 分鐘,,請問小明最少需要多少分鐘能煮好飯?
下面用 sleep() 模擬 io 操作
同步版煮飯
public function sync()
$starttime = time();
echo "開始煲湯..." . php_eol;
sleep(10);
echo "湯好了..." . php_eol;
echo "開始煮飯..." . php_eol;
sleep(8);
echo "飯熟了..." . php_eol;
echo "放油..." . php_eol;
sleep(1);
echo "煎魚..." . php_eol;
sleep(3);
echo "放鹽..." . php_eol;
sleep(1);
echo "出鍋..." . php_eol;
var_dump('總耗時:' . (time() - $starttime) . ' 分鐘');
總耗時:23 分鐘
**很容易看懂,等待湯煮好之後再煮飯,然後再等待飯煮好再炒菜,生活中不會這樣操作吧?這就要引入協程來解決這個問題了。
協程版煮飯
<?php
namespace study\co;
use swoole\coroutine;
use swoole\coroutine\waitgroup;
use swoole;
class co
public function cookbyco()
$starttime = time();
// 開啟一鍵協程化:
swoole\runtime::enablecoroutine($flags = swoole_hook_all);
// 建立乙個協程容器:
// 相當於進入廚房
\co\run(function () {
// 等待結果:
// 記錄哪道菜做好了,哪道菜還需要多長時間
$wg = new waitgroup();
// 儲存資料的結果
// 裝好的菜
$result = ;
// 記錄一下煲湯(記錄乙個任務)
$wg->add();
// 建立乙個煲湯任務(開啟乙個新的協程)
coroutine::create(function () use ($wg, &$result) {
echo "開始煲湯..." . php_eol;
// 煲湯需要6分鐘,所以我們也不用在這裡等湯煮好,
sleep(8);
echo "湯好了..." . php_eol;
// 裝盤
$result['soup'] = '一鍋湯';
$wg->done(); // 標記任務完成
// 記錄一下煮飯(記錄乙個任務)
$wg->add();
// 建立乙個煮飯任務(開啟乙個新的協程)
coroutine::create(function () use ($wg, &$result) {
echo "開始煮飯..." . php_eol;
// 煮飯需要5分鐘,所以我們不用在這裡等飯煮熟,放在這裡一會再來看看好了沒有
// 我們先去煲湯(協程切換)
sleep(10);
echo "飯熟了..." . php_eol;
// 裝盤
$result['rice'] = '一鍋公尺飯';
$wg->done(); // 標記任務完成
// 記錄一下炒菜
$wg->add();
// 建立乙個炒菜任務(再開啟乙個新的協程)
coroutine::create(function () use ($wg, &$result) {
// 煎魚的過程必須放在乙個協程裡面執行,如果不是的話可能魚還沒煎好就出鍋了
// 因為開啟協程後,io全是非同步了,在此demo中每次遇到sleep都會掛起當前協程
// 切換到下乙個協程執行。
// 例如把出鍋這一步開啟乙個新協程執行,則在煎魚的時候魚,魚就出鍋了。
echo "放油..." . php_eol;
sleep(1);
echo "煎魚..." . php_eol;
sleep(3);
echo "放鹽..." . php_eol;
sleep(1);
echo "出鍋..." . php_eol;
// 裝盤
$result['food'] = '魚香肉絲';
$wg->done();
// 等待全部任務完成
$wg->wait();
// 返回資料(上菜!)
var_dump($result);
var_dump('總耗時:' . (time() - $starttime) . ' 分鐘');
總耗時:10 分鐘
swoole 做一頓飯來理解協程
協程可以簡單理解為執行緒,只不過這個執行緒是使用者態的,不需要作業系統參與,建立銷毀和切換的成本非常低,和執行緒不同的是協程沒法利用多核 cpu 的,想利用多核 cpu 需要依賴 swoole 的多程序模型。swoole 協程一章 可以把協程看成一道小學數學的一道題目 合理安排時間 來我們先做一道題...
swoole 學習筆記 做一頓飯來理解協程
簡介 最近學習 swoole 接觸到協程,記錄一下我理解到的協程。文章比較白話,而且目前理解的還非常淺,寫出自己的想法,請大佬們多多指點。協程協程可以簡單理解為執行緒,只不過這個執行緒是使用者態的,不需要作業系統參與,建立銷毀和切換的成本非常低,和執行緒不同的是協程沒法利用多核 cpu 的,想利用多...
swoole 學習筆記 做一頓飯來理解協程
簡介 最近學習 swoole 接觸到協程,記錄一下我理解到的協程。文章比較白話,而且目前理解的還非常淺,寫出自己的想法,請大佬們多多指點。協程協程可以簡單理解為執行緒,只不過這個執行緒是使用者態的,不需要作業系統參與,建立銷毀和切換的成本非常低,和執行緒不同的是協程沒法利用多核 cpu 的,想利用多...