首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在事件循环中多次调用回调函数。

在事件循环中多次调用回调函数。
EN

Stack Overflow用户
提问于 2022-11-11 21:38:10
回答 1查看 71关注 0票数 0

我正在尝试理解下面代码的行为。我尝试注册一个回调函数trampoline,以便使用asyncio模块在事件循环中调用。trampoline got本身被多次调用,我确信这是为什么发生的。我的期望是,回调trampoline只会在0.5秒之后调用自己一次?

代码语言:javascript
复制
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:我也有一个异常,我也不确定:

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-11 23:41:11

问题是,当调用时,trampoline会将回调调度到自身。

这意味着trampoline将在0.5秒后被调用,在0.5秒后再重新安排对自身的回调

要只调用它一次,您应该从.call_later内部删除trampoline并将其移到外部:

代码语言:javascript
复制
...
def trampoline(name: str = "") -> None:
    print("name:", end=" ")
    print_date()

loop.call_later(0.5, trampoline)
...

异常是由于使用.call_soon调用trampoline() (返回值:None)而不是trampoline (函数本身)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74408388

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档