asyncio call_later 立即运行回调

asyncio call_later runs callback without delay

我正在尝试使用 asyncio 每 5 秒无限地 运行 一个特定函数。
我将 call_later 放在函数本身中,以便在 5 秒后将函数安排为 运行,
但是 call_later 保持 运行 函数没有任何延迟并导致 RecursionError: maximum recursion depth exceeded while calling a Python object.

我应该如何解决这个问题?

代码:

def run(count: int, loop: asyncio.AbstractEventLoop):
    print(f"run {count}")
    loop.call_later(5, run(count + 1, loop))

loop = asyncio.new_event_loop()
run(0, loop)

# output:
# run 0
# run 1
# ...
# run 995
# RecursionError
# 
# All these outputs are printed within a second

提前致谢。

有两个问题。首先,当你写

loop.call_later(5, run(count + 1, loop))

您正在将 运行 的 结果 作为参数传递。该行应该是:

loop.call_later(5, run, count + 1, loop)

另外,不要像run(0, loop)那样直接启动,而是在循环中调度到运行;

loop.call_soon(run, 0, loop)