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

Python中aioschedule与其他协程共跑时定时任务不执行问题

问题原因

你的代码存在两处核心逻辑错误:

  • schedule.run_pending() 是单次检查执行的协程,非常驻调度循环。你直接用create_task调用它时,它只会在启动瞬间检查一次有没有到时间的待执行任务——此时你刚注册完2秒间隔的任务,还没到触发时间,检查完无待跑任务后这个协程就直接退出了,后续再也不会执行调度检查,自然永远不会触发bar运行,这也是你只看到foooooo输出的根本原因。
  • 你定义的bar协程内部写了while True死循环,和定时调度逻辑冲突。就算调度器成功触发bar,这个协程启动后会永远卡在自己的内部循环里,不会把控制权交还给调度器,后续所有调度逻辑都会被卡死。如果你的预期是bar每隔2秒输出一次,根本不需要在bar内部写循环;如果你想要bar启动后每秒输出一次、和5秒输出一次的foo并行,那完全没必要用aioschedule注册它,直接像foo一样创建task运行即可。

修正代码

对应「其他任务正常运行,定时任务每隔指定秒数输出bar」的预期,修正后可直接运行的代码如下:

import aioschedule as schedule
import asyncio

async def foo():
    while True:
        print('foooooo')
        await asyncio.sleep(5)

# 定时任务本身不需要写死循环,调度器会按间隔反复触发
async def bar():
    print('bar')

# 手动实现调度器常驻检查循环
async def schedule_runner():
    while True:
        await schedule.run_pending()
        await asyncio.sleep(0.1) # 检查间隔可按需调整,精度要求高就适当调小

schedule.every(2).seconds.do(bar)

loop = asyncio.get_event_loop()
loop.create_task(schedule_runner())
loop.create_task(foo())

try:
    loop.run_forever()
except KeyboardInterrupt:
    loop.stop()

运行后两个任务互不阻塞:每5秒输出一次foooooo,每2秒输出一次bar。


内容的提问来源于stack exchange,提问作者Arief G

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 18:09:28