swoole之協程channel元素個數

2021-09-12 23:50:07 字數 1259 閱讀 7598

channel用於程序內跨協程通訊,按照角色分為生產協程和消費協程。

生產協程,在channel已滿時,會被掛起;

消費協程,在channel為空是,也會被掛起。

<?php

$chan = new \swoole\coroutine\channel(50);

function t4(\swoole\coroutine\channel $chan)

function t5(\swoole\coroutine\channel $chan)

go("t4", $chan);

go("t5", $chan);

go(function () use ($chan)

});

上面的例子,如果賦值$channum=1,會導致channel中有資料未被消費;

如果賦值$channum=3,由於channel資料不足,消費協程會掛起,程式無法正常退出。

準確設定channel元素個數,是很重要的事。

實踐中,有些場景無法**channel元素個數(例如請求第三方介面,如果有資料則push到channel,無資料則不push),那有什麼解決辦法嘛?

有!保證生產者協程不掛起的前提下,在php的register_shutdown_function()函式中,去實現未完成的消費者功能

<?php

register_shutdown_function(function() use ($chan)

});});

這個辦法能解決問題,但是顯然不是那麼優雅,在register_shutdown_function()中處理,也只是臨時解決辦法

協程channel的push/pop機制,決定了需要設定乙個合理的channel元素個數。

實踐中某些場景,又無法準確評估這個值,只能用臨時辦法解決,希望swoole能提供更優雅的解決方式。

由於協程的非順序化處理,channel元素個數的評估是無法實現的。

基於此,通過約定來規避此類問題:

每個生產者協程的結果需要push到channel裡,生產者個數=channel元素個數;

消費者協程只有乙個,且出現在所有的生產者協程後,可以正確讀取到生產者協程個數

讀取生產者協程個數co::stats()或者coroutine::listcoroutines

refer:

swoole的channel之waitgroup實現

swoole使用協程

協程 協程可以理解為純使用者態的執行緒,其通過協作而不是搶占來進行切換。相對於程序或者執行緒,協程所有的操作都可以在使用者態完成,建立和切換的消耗更低。swoole可以為每乙個請求建立對應的協程,根據io的狀態來合理的排程協程,這會帶來了以下優勢 開發者可以無感知的用同步的 編寫方式達到非同步io的...

協程巢狀協程

import asyncio import functools 第三層協程 async def test1 print 我是test1 await asyncio.sleep 1 print test1已經睡了1秒 await asyncio.sleep 3 print test1又睡了3秒 ret...

Swoole協程模式實現Mysql連線池

永不斷開,要求我們的這個程式是乙個常駐記憶體的程式。資料庫連線池 connection pooling 是程式啟 動時建立足夠的資料庫連線,並將這些連線組成乙個連線池,由程式動態地對池中的連線進行申請,使用,釋放。當併發量很低的時候,連線可以臨時建立,但當服務吞吐達到幾百 幾千的時候,頻繁建立連線 ...