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

Python 3中如何并行调用4个异步方法以缩短执行时间?

解决方案

问题根源

你的代码存在两个核心问题:

  • 错误使用await:在提交函数到线程池前,你用await直接执行了每个异步函数(还遗漏了调用括号()),导致四个函数按顺序逐一执行,完全没有实现并行效果。
  • 工具选型错误:ThreadPoolExecutor是用来运行阻塞式同步函数的工具,并不适配异步协程。异步函数需要依托asyncio的事件循环才能实现高效并行调度。

正确实现方式

使用Python标准库asyncio的gather()方法,它能在事件循环中同时调度多个异步协程,真正实现并行执行,总耗时约等于单个函数的执行时间(20分钟)。

修正后的代码

import asyncio

async def foo_1():
    print("foo_1 启动")
    # 模拟20分钟的HTTP请求及验证操作(实际替换为你的业务代码)
    await asyncio.sleep(1200)
    print("foo_1 完成")

async def foo_2():
    print("foo_2 启动")
    await asyncio.sleep(1200)
    print("foo_2 完成")

async def foo_3():
    print("foo_3 启动")
    await asyncio.sleep(1200)
    print("foo_3 完成")

async def foo_4():
    print("foo_4 启动")
    await asyncio.sleep(1200)
    print("foo_4 完成")

async def main():
    # 同时运行所有异步协程
    await asyncio.gather(foo_1(), foo_2(), foo_3(), foo_4())

if __name__ == "__main__":
    asyncio.run(main())

关键注意事项

  • 确保你的HTTP请求使用异步HTTP客户端(如aiohttp),如果使用同步的requests库,会阻塞事件循环,导致无法真正并行。
  • asyncio.gather()会等待所有传入的协程执行完毕后才返回,返回结果是一个包含所有协程返回值的列表。

补充:混合同步与异步场景的处理

如果你的函数中存在无法异步化的阻塞操作(比如某些老旧的同步SDK),可以用asyncio.to_thread()将阻塞逻辑放入线程池,同时与异步协程并行执行:

import asyncio
import requests

def blocking_http_task(url):
    # 同步阻塞的HTTP请求操作
    response = requests.get(url)
    return response.status_code

async def foo_1():
    print("foo_1 启动")
    # 将阻塞任务放入独立线程执行,不阻塞事件循环
    status = await asyncio.to_thread(blocking_http_task, "https://example.com")
    print(f"foo_1 完成,状态码:{status}")

# 其余foo_2/3/4逻辑类似...

async def main():
    await asyncio.gather(foo_1(), foo_2(), foo_3(), foo_4())

asyncio.run(main())

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 02:50:35