swoole 學習筆記 做一頓飯來理解協程

2021-10-19 12:25:58 字數 2793 閱讀 8513

簡介

最近學習 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 的,想利用多...