You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 09:50:24