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
相关产品推荐
相关产品推荐

