C# における async void
と同様の処理を Python ではどうやって書くのか分からなかったので、サンプルコードをメモしておきます。
尚、完了を待たずに実行することを、英語では fire and forget
というようです。
環境
- python 3.6
サンプルコード
def foo(sec: int):
print(f'start: {sec}秒待ちます')
time.sleep(sec)
print(f'finish: {sec}秒待ちました')
loop = asyncio.get_event_loop()
loop.run_in_executor(None, foo, 3)
# プログラムが終了しないように待っているだけ(実際には以下は不要)
print(f'wait')
time.sleep(10)
print(f'exit')
出力結果
start: 3秒待ちます
wait
finish: 3秒待ちました
exit
もうちょっと汎用的に
def fire_and_forget(task, *args, **kwargs):
loop = asyncio.get_event_loop()
if callable(task):
return loop.run_in_executor(None, task, *args, **kwargs)
else:
raise TypeError('Task must be a callable')
def foo(sec: int):
print(f'start: {sec}秒待ちます')
time.sleep(sec)
print(f'finish: {sec}秒待ちました')
fire_and_forget(foo, 3)
# プログラムが終了しないように待っているだけ(実際には以下は不要)
print(f'wait')
time.sleep(10)
print(f'exit')
出力結果は同じなので省略します。