asyncio事件循环回调重复调用及TypeError异常问题咨询
问题分析与解决
一、异常原因
你写的loop.call_soon(trampoline())是直接执行了trampoline函数,把它的返回值(None)传给了call_soon。但call_soon要求传入的是可调用对象(比如函数本身),不是函数执行后的结果。所以事件循环尝试调用None时,就抛出了TypeError: 'NoneType' object is not callable。
二、多次调用的原因
你的trampoline函数内部每次执行都会调用loop.call_later(0.5, trampoline, name)——这相当于每0.5秒就给事件循环再注册一次trampoline自己。只要事件循环没停止,这个过程就会一直重复,所以函数会被不断调用,直到8秒后loop.stop()触发。
修正后的代码
需求1:持续每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()
需求2:仅初始调用后自我调用一次
import asyncio import datetime loop = asyncio.get_event_loop() has_called_self = False def print_date(): print(datetime.datetime.now()) def trampoline(name: str = "") -> None: global has_called_self print("name:", end=" ") print_date() if not has_called_self: loop.call_later(0.5, trampoline, name) has_called_self = True loop.call_soon(trampoline) loop.call_later(8, loop.stop) loop.run_forever()
内容的提问来源于stack exchange,提问作者Avv
相关产品推荐
相关产品推荐

