1. ホーム
  2. python

[解決済み] asyncioで関数を定期的に実行するにはどうしたらいいですか?

2023-05-26 04:01:42

質問

私は tornado から asyncio が見つからない、そして asyncio に相当する tornado 's PeriodicCallback . (A PeriodicCallback は2つの引数を取ります: 実行する関数と、呼び出しの間のミリ秒数です)。

  • にそのような等価なものがあるのでしょうか? asyncio ?
  • もしそうでなければ、これを実装するのに一番きれいな方法は何でしょうか。 RecursionError を取得するリスクを負うことなく、これを実装する最もきれいな方法は何でしょうか?

どのように解決するのですか?

Pythonのバージョンが3.5以下の場合。

import asyncio

@asyncio.coroutine
def periodic():
    while True:
        print('periodic')
        yield from asyncio.sleep(1)

def stop():
    task.cancel()

loop = asyncio.get_event_loop()
loop.call_later(5, stop)
task = loop.create_task(periodic())

try:
    loop.run_until_complete(task)
except asyncio.CancelledError:
    pass

Python 3.5以上の場合。

import asyncio

async def periodic():
    while True:
        print('periodic')
        await asyncio.sleep(1)

def stop():
    task.cancel()

loop = asyncio.get_event_loop()
loop.call_later(5, stop)
task = loop.create_task(periodic())

try:
    loop.run_until_complete(task)
except asyncio.CancelledError:
    pass