我正在尝试理解下面代码的行为。我尝试注册一个回调函数trampoline,以便使用asyncio模块在事件循环中调用。trampoline got本身被多次调用,我确信这是为什么发生的。我的期望是,回调trampoline只会在0.5秒之后调用自己一次?
import asyncio
import datetime
loop = asyncio.get_event_loop()
def print_date():
print(datetime.datetime.now())
def trampoline(name: str = "") -> None:
print("name:", end=" ")
print_date()
loop.call_later(0.5, trampoline, name)
loop.call_soon(trampoline())
loop.call_later(8, loop.stop)
loop.run_forever()Output:我也有一个异常,我也不确定:
name: 2022-11-11 16:29:04.335313
Exception in callback None()
handle: <Handle>
Traceback (most recent call last):
File "C:\Anaconda3\lib\asyncio\events.py", line 81, in _run
self._context.run(self._callback, *self._args)
TypeError: 'NoneType' object is not callable
name: 2022-11-11 16:29:04.850481
name: 2022-11-11 16:29:05.363303
name: 2022-11-11 16:29:05.872649
name: 2022-11-11 16:29:06.383004
name: 2022-11-11 16:29:06.898766
name: 2022-11-11 16:29:07.413907
name: 2022-11-11 16:29:07.915795
name: 2022-11-11 16:29:08.428609
name: 2022-11-11 16:29:08.939604
name: 2022-11-11 16:29:09.454111
name: 2022-11-11 16:29:09.966438
name: 2022-11-11 16:29:10.470832
name: 2022-11-11 16:29:10.981675
name: 2022-11-11 16:29:11.496746
name: 2022-11-11 16:29:12.011841
Process finished with exit code 0发布于 2022-11-11 23:41:11
问题是,当调用时,trampoline会将回调调度到自身。
这意味着trampoline将在0.5秒后被调用,在0.5秒后再重新安排对自身的回调
要只调用它一次,您应该从.call_later内部删除trampoline并将其移到外部:
...
def trampoline(name: str = "") -> None:
print("name:", end=" ")
print_date()
loop.call_later(0.5, trampoline)
...异常是由于使用.call_soon调用trampoline() (返回值:None)而不是trampoline (函数本身)。
https://stackoverflow.com/questions/74408388
复制相似问题