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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 09:24:03