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

如何在Python中创建更优协程:异步函数并行无阻塞执行需求

实现异步函数并行执行的方法

你的问题根源在于每次调用asyncio.run()都会启动一个独立的事件循环,两个循环串行执行,所以第二个函数必须等第一个循环结束才会运行。要让两个异步函数互不阻塞、同时运行,需要把它们放到同一个事件循环里执行,下面提供两种常用实现方式:

1. 同时启动多个异步函数(已知需并行的函数)

使用asyncio.gather()可以将多个协程打包,让它们在同一个事件循环里并行执行:

import asyncio

async def func1():
    await asyncio.sleep(1)
    print("func1 completed")

async def func2():
    await asyncio.sleep(1)
    print("func2 completed")

async def main():
    # 同时运行func1和func2
    await asyncio.gather(func1(), func2())

asyncio.run(main())

运行后两个函数会同时开始执行,1秒后几乎同时输出结果(顺序可能因调度略有不同),符合你想要的无额外延迟的效果。

2. 动态触发异步函数(不确定调用时机)

如果两个函数的调用时机不确定(比如一个在某个事件触发后才调用),可以用asyncio.create_task()将协程包装成任务,添加到当前事件循环中,这样新任务会和已有任务并行执行:

import asyncio

async def func1():
    await asyncio.sleep(1)
    print("func1 completed")

async def func2():
    await asyncio.sleep(1)
    print("func2 completed")

async def main():
    # 先启动func1任务
    task1 = asyncio.create_task(func1())
    # 模拟不确定的延迟后启动func2
    await asyncio.sleep(0.5)
    task2 = asyncio.create_task(func2())
    # 等待所有任务完成(如果需要等待结果的话)
    await task1
    await task2

asyncio.run(main())

这种方式下,func1启动0.5秒后func2才启动,但两个任务在各自的sleep期间不会互相阻塞,总耗时约1秒(而非1+1=2秒)。

关键说明

  • 不要在同一个程序里多次调用asyncio.run(),除非你明确需要独立的事件循环。
  • create_task()是动态添加并行任务的核心,只要在同一个事件循环中,任务就会被异步调度执行,互不阻塞。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 03:01:49