swoole coroutine協程訊息佇列

2021-10-01 13:14:28 字數 1379 閱讀 1387

首先測試乙個訊息佇列的例子:

use swoole\coroutine as co;

$channel = new co\channel(100);

co::create(function() use($channel)

});var_dump($channel->length());

swoole_event::wait()

演示結果:

可以看到,程式先返回的是訊息佇列的數量,我看官方這個例子下面有人提問說為什麼佇列數量一直是0,看到這個顯示結果應該明白了,程式是執行到協程**的地方直接返回結果,然後在執行協程裡面的**,就如上圖所示。那怎麼能查詢到當前記憶體中訊息佇列的數量呢,我想有兩種方法,一種在新增訊息佇列過後直接查詢數量,第二種在伺服器中使用訊息佇列,伺服器沒有關閉之前,只要訊息佇列裡面的訊息沒有被消費,就可以查詢到訊息佇列的數量和狀態。估計要使用協程伺服器才可以。

第一種**很簡單,在echo "$i\n"; 的後面加上 var_dump($channel->length()); 插入一條,顯示一下訊息佇列的數量。下面是第二種方法:

use swoole\coroutine as co;

$channel = new co\channel(100);

go(function () use($channel)else

});$response->header("content-type","text/html; charset=utf-8");

$response->end("");

}});

$server->handle('/test', function ($request, $response) use($channel,$server)else

});$server->handle('/stop', function ($request, $response) use ($channel,$server) else

});$server->start();

});

演示結果如下:

每次新增10個訊息,檢視佇列數量。消費乙個訊息,當新增到100訊息的時候,後面新增的訊息阻塞在佇列之外,等待消費者消費訊息在100以下,後面的訊息才能入隊。不然會一直阻塞等待在佇列之外等待入隊。

以上就是訊息佇列的簡單例子,感覺用起來有點單一,難道整個伺服器啟動之後就只能建立以個數為名字的訊息佇列嗎?我建立兩個訊息佇列相互影響嗎? 還需要繼續**一下。

協程巢狀協程

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

9 協程 協程理論

本節的主題是基於單執行緒來實現併發,即只用乙個主線程 很明顯可利用的cpu只有乙個 情況下實現併發,為此我們需要先回顧下併發的本質 切換 儲存狀態 ps 在介紹程序理論時,提及程序的三種執行狀態,而執行緒才是執行單位,所以也可以將上圖理解為執行緒的三種狀態cpu正在執行乙個任務,會在兩種情況下切走去...

python協程與非同步協程

在前面幾個部落格中我們一一對應解決了消費者消費的速度跟不上生產者,浪費我們大量的時間去等待的問題,在這裡,針對業務邏輯比較耗時間的問題,我們還有除了多程序之外更優的解決方式,那就是協程和非同步協程。在引入這個概念之前我們先看 看這個圖 從這個我們可以看出來,假如來了9個任務,即使我們開了多程序,在業...