高并发调用大语言模型:Python 异步网络编程

在LLM调用时,传统方式是基于OpenAI SDK同步:

方式1:使用 OpenAI SDK(同步)

python 复制代码
from openai import OpenAI

client = OpenAI(api_key="xxx", base_url="https://api.deepseek.com")

# 同步调用,一个接一个
for i in range(100):
    response = client.chat.completions.create(
        model="deepseek-chat",
        messages=[{"role": "user", "content": "决策..."}]
    )
# 100个请求串行执行,耗时很长

✓ 方式一:使用 OpenAI 官方 SDK(异步)

对于异步场景,OpenAI SDK v1.0+ 现在也支持异步(AsyncOpenAI),但这个代码可能是在那之前写的,或者是为了保持对多个非官方提供商的统一接口。如果只需要 OpenAI 官方 API,改用 SDK 可以简化代码。

代码示例(异步)

python 复制代码
import asyncio
from openai import AsyncOpenAI

async def use_openai_sdk():
    client = AsyncOpenAI(api_key="your-api-key-here")
    response = await client.chat.completions.create(
        model="gpt-3.5-turbo",
        messages=[{"role": "user", "content": "Hello!"}]
    )
    print(response.choices[0].message.content)

# 运行
asyncio.run(use_openai_sdk())

优点:

  • 简洁易读:无需手动构造请求头、JSON body。
  • 类型安全:支持 Pydantic 模型,返回结构化对象。
  • 自动重试、超时、流式处理等高级功能
  • 官方维护,与 API 同步更新。

缺点:

  • 需要额外安装 openai 包。
  • 灵活性略低(但对大多数场景足够)。

但是面对大量请求,并且希望代码支持多个 LLM 提供商(deepseek、mimo、bigmodel),它们都提供 OpenAI 兼容 API。使用 aiohttp 可以统一调用方式,实现原生异步支持 + 高并发控制,不需要为每个提供商安装不同的 SDK。

✓ 方式二:使用 aiohttp 手动发起 HTTP 请求

aiohttp 是一个基于 Python 的 异步 HTTP 客户端/服务器框架,它建立在 asyncio(Python 内置的异步 I/O 框架)之上,支持 异步发送 HTTP 请求(客户端) 和 构建异步 Web 服务(服务器)。常用于:

  • 调用 RESTful API(如 OpenAI、GitHub API 等)
  • 并发抓取多个网页
  • 微服务间通信

使用前安装依赖:

bash 复制代码
pip install aiohttp

代码示例(异步)

python 复制代码
import asyncio
import aiohttp
import json

async def use_aiohttp():
    url = "https://api.openai.com/v1/chat/completions"
    headers = {
        "Authorization": "Bearer your-api-key-here",
        "Content-Type": "application/json"
    }
    payload = {
        "model": "gpt-3.5-turbo",
        "messages": [{"role": "user", "content": "Hello!"}]
    }

    async with aiohttp.ClientSession() as session:
        async with session.post(url, headers=headers, json=payload) as resp:
            if resp.status == 200:
                data = await resp.json()
                print(data["choices"][0]["message"]["content"])
            else:
                error = await resp.text()
                print(f"Error: {resp.status}, {error}")

# 运行
asyncio.run(use_aiohttp())

优点:

  • 完全控制请求细节(如自定义超时、代理、重试逻辑等)。
  • 不依赖 OpenAI SDK,适合轻量级或定制化场景。
  • 可用于调用任何兼容 OpenAI 协议的第三方 API(如本地部署的 LLM)。

缺点:

  • 代码冗长,需手动处理 JSON、错误、认证等。
  • 无类型提示,容易出错(如拼错字段名)。
  • 需自行实现流式响应、重试、速率限制等逻辑。

🔍 对比总结

特性 OpenAI SDK(AsyncOpenAI) aiohttp 手动请求
代码简洁性 ⭐⭐⭐⭐⭐ ⭐⭐
类型安全 ✓(Pydantic 模型) ❌(纯 dict)
自动处理认证/序列化 ❌(需手动)
流式响应支持 ✓(stream=True ✓(但需手动解析 SSE)
灵活性 中等 极高
依赖 openai 仅需 aiohttp
适用场景 快速开发、标准调用 定制协议、调试、轻量环境

💡 建议

  • 日常开发推荐使用 OpenAI SDK,它更安全、高效、可维护。
  • 只有在需要绕过 SDK 限制(如使用非官方 endpoint、自定义中间件、性能极致优化)时,才考虑用 aiohttp。

除了aiohttprequestshttpx 都是 Python 中用于发送 HTTP 请求的流行库,但它们在设计理念、使用场景和功能特性上有显著区别:

库名 类型 异步支持 同步支持 是否可做 Web 服务器
requests 同步 HTTP 客户端
aiohttp 异步 HTTP 客户端 + 服务器
httpx 现代 HTTP 客户端(同步+异步)

✓ = 支持,❌ = 不支持

码示例对比

场景:向 https://httpbin.org/post 发送 POST 请求

1. requests(同步)
python 复制代码
import requests

response = requests.post(
    "https://httpbin.org/post",
    json={"hello": "world"},
    headers={"User-Agent": "MyApp/1.0"}
)
print(response.json()["json"])
2. aiohttp(异步)
python 复制代码
import aiohttp
import asyncio

async def main():
    async with aiohttp.ClientSession() as session:
        async with session.post(
            "https://httpbin.org/post",
            json={"hello": "world"},
            headers={"User-Agent": "MyApp/1.0"}
        ) as resp:
            data = await resp.json()
            print(data["json"])

asyncio.run(main())
3. httpx(同步 or 异步)

同步模式(像 requests):

python 复制代码
import httpx

response = httpx.post(
    "https://httpbin.org/post",
    json={"hello": "world"},
    headers={"User-Agent": "MyApp/1.0"}
)
print(response.json()["json"])

异步模式(简洁):

python 复制代码
import httpx
import asyncio

async def main():
    async with httpx.AsyncClient() as client:
        response = await client.post(
            "https://httpbin.org/post",
            json={"hello": "world"},
            headers={"User-Agent": "MyApp/1.0"}
        )
        print(response.json()["json"])

asyncio.run(main())
相关推荐
梦想的颜色1 天前
Kafka内核解密:架构拓扑、数据流转与生产消费模型的深度剖析
kafka·高并发·多线程·异步·消息组件·生产者与消费者模式
梦想的颜色4 天前
Redis数据类型全解析:从底层原理到生产实战
运维·数据库·redis·缓存·高并发·分布式锁·数据类型
Java爱好狂.6 天前
Java高并发系统架构设计核心技术开源!
java·高并发·并发编程·java面试·java面试题·java程序员·java八股文
我心飞翔@坚持不懈11 天前
高并发高可用电商平台交易架构实战(避坑)指南
高并发·架构设计·高可用·分布式系统·电商架构·架构避坑
better_liang14 天前
每日Java面试场景题知识点之-分布式秒杀系统的设计
java·redis·分布式·消息队列·高并发·秒杀系统·限流降级
梵得儿SHI14 天前
SpringCloud 进阶拓展:性能优化指南(缓存三大问题 + 分库分表入门)
spring cloud·缓存·微服务·性能优化·高并发·分库分表·数据库优化
梵得儿SHI20 天前
Java IO 流进阶:Buffer 与 Channel 核心概念解析及与传统 IO 的本质区别
java·开发语言·高并发·nio·channel·buffer·提升io效率
牧羊狼的狼20 天前
高并发会带来哪些问题,如何解决?
缓存·高并发
梦梦代码精22 天前
LikeShop按摩到家系统:2026年本地生活创业新风口,上门服务O2O源码私有化部署实战
大数据·docker·小程序·uni-app·生活·高并发·开源软件
代码讲故事1 个月前
Redis生产环境批量的key需要删除,如何优雅实现且不影响线上环境?有密码认证的如何实现批量删除?有哪些实现方法?
运维·redis·缓存·高并发·删除·批量·生产环境