初めに
並「行」処理扱うことになったので備忘録として残しておきます。
コード
heiko.py
import asyncio
import time
async def hoge():
print('タスク1です')
# asyncio.sleep()は指定時間だけタスクを中断し、その間他のタスクに制御を握らせるタスクです
# これによりタスク1が2秒間中断されタスク2が走ります
await asyncio.sleep(2)
print('タスク1でした')
async def fuga():
print('タスク2です')
for l in range(100000000):
n = l
print('タスク2でした')
async def main():
print('開始')
start = time.time()
# create_taskにコルーチンを渡すとタスクになります
# taskは定義と同時にスケジューリングされますが、実行されるタイミングはイベントループ次第です
task1 = asyncio.create_task(hoge())
task2 = asyncio.create_task(fuga())
# await タスク名 で制御を手放し、タスクの完了を待ちます
await task1
await task2
# タスクの完了後に実行したい処理はawait以降に記述します
print(time.time() - start)
print('終了')
# コルーチンを渡してイベントループを起動します
asyncio.run(main())
動作
1.開始時刻を取得する
2.タスク1とタスク2がイベントループに追加される
3.イベントループはタスク1の完了を待つ
4.タスク1は2秒間処理を中断し、その間はタスク2に制御が渡る
5.タスク2の処理は(環境にもよるが)1.9秒程度で終了し、標準出力に終了通知を出す
6.タスク1に制御が渡り、終了通知を出力してイベントループに制御が戻る
7.イベントループはタスク2の終了を待つが、既に終了している
8.時刻の差分から経過時間を導出してオワリッ!
※タスク2のforループが2秒以上かかる場合は2秒経ってもタスク1に制御が渡らないので注意
参考文献