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

環境
- 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
のほうは、キューの中身を全部取り終わって次のデータ待ちになったところで制御が他に移っています。