asyncio でよく使うやつ
非同期処理ってあんまり使う場面が少ないのでついつい忘れがちです。備忘録代わりに記事としてまとめておきました。
fire and forget と gather の組み合わせ
使用場面として一番多い気がします。複数処理を走らせて、まとめて結果を得る方法ですね。fire and forget デコレータを使用することで通常の関数を何でもコルーチンにまとめてしまえるので愛用しています。import asyncio
import time
def fire_and_forget(f):
"""対象関数を非同期で投げっぱなしにするためのデコレータ"""
def wrapped(*args, **kwargs):
return asyncio.get_event_loop().run_in_executor(None, f, *args, *kwargs)
return wrapped
# 並列させたい重たい処理
@fire_and_forget
def function_1(sec):
print(f'{sec} 秒待ちます')
time.sleep(sec)
return f'{sec} 秒の待機に成功しました'
async def main():
print(f"main開始 {time.strftime('%X')}")
co_list = [function_1(1), function_1(3), asyncio.wait_for(function_1(5), timeout=4)]
results = await asyncio.gather(*co_list, return_exceptions=True)
print(results)
print(f"main終了 {time.strftime('%X')}")
asyncio.run(main())