Python中如何无需等待执行完成即可启动asyncio异步任务
实现方案
你只需要使用asyncio.create_task()来提交task2协程即可,这个方法会把task2交给当前事件循环调度,不会阻塞主协程的运行,主循环可以直接继续执行后续逻辑,task2会在事件循环的下一个调度时机自动执行直到完成。
注意原有代码的隐藏问题
你当前写的task2中直接赋值task_2_running会被Python识别为局部变量,无法修改全局的运行状态标记,必须加global声明才能正常更新状态。同时建议用try...finally包裹状态重置逻辑,避免task2执行报错后状态永远标记为运行中。
修改后的完整示例代码
import asyncio task_2_running = False async def do_something(): # 替换为你实际的异步逻辑 await asyncio.sleep(2) print("task2执行完成") async def task1(): # 替换为你实际的task1逻辑 await asyncio.sleep(1) return "demo_data" def do_something(x): print(f"处理task1返回值:{x}") def some_condition(x): # 替换为你实际的判断逻辑 return True async def task2(): global task_2_running task_2_running = True try: await do_something() finally: # 无论执行是否出错,都重置运行状态 task_2_running = False async def main(): while True: x = await task1() do_something(x) if some_condition(x) and not task_2_running: # 核心调用:提交task2,不等待执行完成 asyncio.create_task(task2()) if __name__ == "__main__": loop = asyncio.get_event_loop() loop.run_until_complete(main())
补充说明
- Python 3.7以前的版本没有
asyncio.create_task(),可以替换为loop.create_task(task2())实现相同效果。 - 如果需要捕获
task2的运行异常,可以给返回的Task对象添加完成回调,避免异常静默丢失:
def handle_task_exception(task): try: task.result() except Exception as e: print(f"task2运行出错:{repr(e)}") # 提交时添加回调 task_obj = asyncio.create_task(task2()) task_obj.add_done_callback(handle_task_exception)
内容的提问来源于stack exchange,提问作者Jeffrey Chen
相关产品推荐
相关产品推荐

