PHP之Swoole 學習筆記-用做飯的方式來理解協程
簡介
最近學習 swoole 接觸到協程,記錄一下我理解到的協程。
文章比較白話,而且目前理解的還非常淺,寫出自己的想法,請大佬們多多指點。
協程
協程可以簡單理解為執行緒,只不過這個執行緒是使用者態的,不需要作業系統參與,建立銷燬和切換的成本非常低,和執行緒不同的是協程沒法利用多核 cpu 的,想利用多核 cpu 需要依賴 Swoole 的多程式模型。—— swoole 協程一章
我的理解
可以把協程看成一道小學數學的一道題目:“合理安排時間”,來我們先做一道題目:
小明下班後回家煮飯,煲湯需要 10 分鐘,煮飯需要 8 分鐘, 炒菜需要 5 分鐘,,請問小明最少需要多少分鐘能煮好飯?
下面用 sleep() 模擬 IO 操作
同步版煮飯
public function async()
{
$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();
// 開啟一鍵協程化: https://wiki.swoole.com/#/runtime?id=swoole_hook_all
Swoole\Runtime::enableCoroutine($flags = SWOOLE_HOOK_ALL);
// 建立一個協程容器: https://wiki.swoole.com/#/coroutine/scheduler
// 相當於進入廚房
\Co\run(function () {
// 等待結果: https://wiki.swoole.com/#/coroutine/wait_group?id=waitgroup
// 記錄哪道菜做好了,哪道菜還需要多長時間
$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 分鐘
答:小明最少需要 10 分鐘能煮好飯。
主要參考過的文章
www.easyswoole.com/Cn/NoobCourse/coroutine.html
hyperf.wiki/#/zh-cn/coroutine
wiki.swoole.com/#/coroutine
點關注,不迷路
好了各位,以上就是這篇文章的全部內容了,能看到這裡的人呀,都是人才。之前說過,PHP方面的技術點很多,也是因為太多了,實在是寫不過來,寫過來了大家也不會看的太多,所以我這裡把它整理成了PDF和文件,如果有需要的可以
更多學習內容可以訪問【對標大廠】精品PHP架構師教程目錄大全,只要你能看完保證薪資上升一個臺階(持續更新)
以上內容希望幫助到大家,很多PHPer在進階的時候總會遇到一些問題和瓶頸,業務程式碼寫多了沒有方向感,不知道該從那裡入手去提升,對此我整理了一些資料,包括但不限於:分散式架構、高可擴充套件、高效能、高併發、伺服器效能調優、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql優化、shell指令碼、Docker、微服務、Nginx等多個知識點高階進階乾貨需要的可以免費分享給大家,需要的可以加入我的 PHP技術交流群
相關文章
- swoole 學習筆記-做一頓飯來理解協程筆記
- 【學習篇】Swoole 協程
- [學習篇] Swoole 協程
- unity學習筆記-C#協程Unity筆記C#
- 【Swoole原始碼研究】深入理解Swoole協程實現原始碼
- golang學習筆記(二)—— 深入golang中的協程Golang筆記
- Python學習筆記|Python之yield理解Python筆記
- 飛機的 PHP 學習筆記之安全篇PHP筆記
- 飛機的 PHP 學習筆記之 Web 篇PHP筆記Web
- PHP 學習筆記PHP筆記
- Swoft 框架 1.0 正式來襲,首個基於 Swoole 原生協程的 PHP 框架框架PHP
- 【學習筆記】CSS深入理解之margin筆記CSS
- 【學習筆記】CSS深入理解之overflow筆記CSS
- 【學習筆記】CSS深入理解之relative筆記CSS
- Swoole協程與Go協程的區別Go
- Swoole 協程與 Go 協程的區別Go
- swoole協程初探
- AI學習筆記之——如何理解機器學習(Machine Learning)AI筆記機器學習Mac
- swoole 協程原始碼解讀 (協程的排程)原始碼
- 飛機的 PHP 學習筆記之資料庫篇PHP筆記資料庫
- go lang學習筆記——channel機理及排程理解Go筆記
- swoole 協程原始碼解讀 (協程的建立)原始碼
- 《PHP學習筆記——PHP基本語法》PHP筆記
- batch normalization學習理解筆記BATORM筆記
- Raft協議學習筆記Raft協議筆記
- Raft 協議學習筆記Raft協議筆記
- 學習筆記 - DNS協議筆記DNS協議
- IP協議學習筆記協議筆記
- 【學習筆記】CSS深入理解之vertical-align筆記CSS
- SQLServer學習筆記 - 主鍵的理解SQLServer筆記
- 飛機的 PHP 學習筆記之應用技術篇PHP筆記
- 飛機的 PHP 學習筆記之語言基礎篇PHP筆記
- php 學習筆記之關於時區的那點事PHP筆記
- TCP/IP學習筆記之協議和郵件TCP筆記協議
- lua課程學習筆記筆記
- PHP 與 Swoole 淺析與學習PHP
- php 學習筆記之搭建開發環境(mac版)PHP筆記開發環境Mac
- php設計模式學習筆記PHP設計模式筆記