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

2020/03/03

[Python] 非同期処理を完了を待たずに実行する(fire and forget)

update2021/08/13 event_note2020/03/03 5:28

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')

出力結果は同じなので省略します。