如何实现aioschedule多任务并行运行,解决任务阻塞问题?
解决aioschedule任务阻塞问题,实现异步任务并行调度
问题分析
你的代码存在两个核心问题,导致任务无法真正并行执行:
loop.run_until_complete(aioschedule.run_pending())会同步等待本次触发的所有任务执行完毕才继续循环。work_1内部的await asyncio.sleep(30)虽是异步操作,但run_until_complete会强制等待该任务完全结束,直接卡住整个调度流程30秒。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
相关产品推荐
相关产品推荐

