プログラムを中心とした個人的なメモ用のブログです。 タイトルは迷走中。
内容の保証はできませんのであしからずご了承ください。

2023/02/01

[Python] asyncio.Queue の動きを確認してみた

event_note2023/02/01 4:26

putget がコルーチンになっていたので、どういう動きになるのか確認してみました。

環境

  • Python 3.8.1

サンプルコード

import asyncio

async def put(q:asyncio.Queue):
    count = 0
    while count <= 100:
        print(f'({count}) before put')
        await q.put(count)
        print(f'({count}) after put')
        count += 1
        if count % 5 == 0:
            # 5回送ったらスリープ
            await asyncio.sleep(0.01)

async def get(q:asyncio.Queue):
    count = 0
    while count < 100:
        count = await q.get()
        print(f'({count}) get')

async def main():
    q = asyncio.Queue()
    await asyncio.gather(*[ put(q), get(q) ])

asyncio.run(main())

出力は以下のようになりました。

(0) before put
(0) after put
(1) before put
(1) after put
(2) before put
(2) after put
(3) before put
(3) after put
(4) before put
(4) after put
(0) get
(1) get
(2) get
(3) get
(4) get
(5) before put
(5) after put
(6) before put
(6) after put
(7) before put
(7) after put
(8) before put
(8) after put
(9) before put
(9) after put
(5) get
(6) get
(7) get
(8) get
(9) get

put したあと、sleep したところで制御が他に移っています。
get のほうは、キューの中身を全部取り終わって次のデータ待ちになったところで制御が他に移っています。

参考 URL