Python中不用await如何运行async异步任务?create_task提交任务不执行怎么办
任务未执行的核心原因
- 调用
loop.create_task(my_task())仅会将任务加入事件循环的待调度队列,并不会启动事件循环本身。你的代码中主线程执行完print("2222")后直接退出,事件循环还没来得及调度任务运行,程序就已经终止了。 - 额外注意:你代码中使用的
time.sleep(2)是同步阻塞方法,会卡住整个事件循环的所有任务执行,异步场景下需要替换为await asyncio.sleep(2)。
不手动await单个任务的正确运行方案
方案1:批量等待所有 pending 任务执行完成
如果你只是要提交多个后台任务,不需要逐个await,可收集事件循环中所有待执行任务,通过loop.run_until_complete一次性运行到所有任务结束:
import asyncio async def my_task(): print("starting my task...") await asyncio.sleep(2) print("finished my task.") if __name__ == '__main__': print("1111") loop = asyncio.get_event_loop() loop.create_task(my_task()) print("2222") # 启动事件循环,直到所有已提交的任务执行完成再退出 loop.run_until_complete(asyncio.gather(*asyncio.all_tasks(loop))) loop.close()
运行输出:
1111 2222 starting my task... finished my task.
方案2:长期运行事件循环(适合后台服务场景)
如果你的程序是需要持续运行的后台服务,可调用loop.run_forever()启动事件循环,循环会一直运行直到主动调用loop.stop():
import asyncio async def my_task(): print("starting my task...") await asyncio.sleep(2) print("finished my task.") # 任务完成后主动停止循环,可根据业务需求决定是否保留该逻辑 loop.stop() if __name__ == '__main__': print("1111") loop = asyncio.get_event_loop() loop.create_task(my_task()) print("2222") # 事件循环持续运行,直到收到停止指令 loop.run_forever() loop.close()
内容的提问来源于stack exchange,提问作者ytang
相关产品推荐
相关产品推荐

