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

如何实现aioschedule多任务并行运行,解决任务阻塞问题?

解决aioschedule任务阻塞问题,实现异步任务并行调度

问题分析

你的代码存在两个核心问题,导致任务无法真正并行执行:

  1. loop.run_until_complete(aioschedule.run_pending()) 会同步等待本次触发的所有任务执行完毕才继续循环。work_1内部的await asyncio.sleep(30)虽是异步操作,但run_until_complete会强制等待该任务完全结束,直接卡住整个调度流程30秒。
  2. time.sleep(1)是同步阻塞调用,会挂起整个线程,这段时间内异步循环无法处理任何其他任务。

修复后的代码

import asyncio
import aioschedule
from datetime import datetime


async def work_1():
    print('work1', datetime.now())
    await asyncio.sleep(30)
    

async def work_2():
    print('work2', datetime.now())
                

async def main():    
    aioschedule.every(5).seconds.do(work_1)
    aioschedule.every(10).seconds.do(work_2)

    while True:
        # 触发待执行任务,但不等待任务完成
        await aioschedule.run_pending()
        # 用异步sleep替代同步sleep,让循环等待时仍能处理其他任务
        await asyncio.sleep(1)
        

if __name__ == "__main__":
    asyncio.run(main())

改动说明

  • 将main改为异步函数,用asyncio.run()启动,这是Python 3.7+官方推荐的异步程序入口写法。
  • 用await aioschedule.run_pending()替代loop.run_until_complete(...):run_pending()本身是异步函数,await它仅会触发任务提交到异步循环,不会等待任务执行完毕,这样work_1和work_2可以同时运行。
  • 用await asyncio.sleep(1)替代time.sleep(1):异步sleep不会阻塞线程,等待期间异步循环可以正常处理work_1的sleep、work_2的执行等其他任务。

预期输出

修改后,work_1会每5秒触发一次(即使前一个work_1还在执行sleep),work_2每10秒正常执行,完全并行运行,示例输出如下:

work1 2024-05-28 18:20:00.123456
work2 2024-05-28 18:20:05.123456
work1 2024-05-28 18:20:05.123456
work1 2024-05-28 18:20:10.123456
work2 2024-05-28 18:20:15.123456
...

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 09:22:46