Closed1

Python 3.10 非同期処理を完了を待たないで実行

3w36zj63w36zj6

完了を待たないで実行(fire and forget)

run_in_executor()の引数は(executor, func, *args)になっているので、呼び出す関数を2番目の引数、呼び出す関数に渡す引数を3番目以降の可変長引数に渡す。

Python3.10以降では、asyncio.get_event_loop()をした際に実行中のイベントループがない場合はDeprecationWarningが出るのでasyncio.new_event_loop()を使う。

import asyncio
import time

def func(sec: int):
    print("start")
    time.sleep(sec)  # 重い処理の代わり
    print("finish")

for i in range(10):
    print(i)
    if i == 3:
        asyncio.new_event_loop().run_in_executor(None, func, 3)
    time.sleep(1)
実行結果
0
1
2
3
start
4
5
finish
6
7
8
9

https://docs.python.org/3/library/asyncio-eventloop.html#asyncio.get_event_loop

https://kuttsun.blogspot.com/2020/03/python-fire-and-forget.html

https://stackoverflow.com/questions/69728622/problems-with-event-loops-in-python-3-10

このスクラップは2022/07/09にクローズされました