Django WebSocket如何同时接收并处理两个ChatGPT请求?
问题原因及解决方案
问题根源
你当前代码中使用的是OpenAI同步SDK,openai.ChatCompletion.create()是同步阻塞调用,会占用整个async事件循环,导致第二个请求必须等第一个请求的同步任务完全结束后才能执行,因此出现了串行执行的日志。
解决步骤
要实现并行处理,必须改用OpenAI的异步客户端,确保所有IO操作都是非阻塞的,让事件循环可以同时处理多个任务。
修改后的代码
import json import asyncio from openai import AsyncOpenAI from channels.generic.websocket import AsyncWebsocketConsumer class GPTAPIConsumer(AsyncWebsocketConsumer): # 初始化异步OpenAI客户端 client = AsyncOpenAI(api_key="你的API密钥") async def connect(self): await self.accept() async def receive(self, text_data): data = json.loads(text_data) print('Start', data['requestID']) # 创建异步任务提交到事件循环,不阻塞后续请求处理 asyncio.create_task(self.streamToClient(data['requestID'])) async def streamToClient(self, requestID): # 异步调用OpenAI流式接口,不阻塞事件循环 stream = await self.client.chat.completions.create( model="gpt-3.5-turbo", messages=[{"role": "user", "content": "你的请求内容"}], stream=True, # 若需调用函数,补充对应参数 functions=[...], function_call={"name": "你的函数名"} ) content = '' # 异步遍历流式响应,保证遍历过程非阻塞 async for chunk in stream: if chunk.choices[0].delta.function_call: chunk_content = chunk.choices[0].delta.function_call.arguments if chunk_content is not None: content += chunk_content await self.send(text_data=json.dumps({'text': content})) print('End', requestID)
关键修改点
- 替换OpenAI同步客户端为
AsyncOpenAI异步客户端 - 将同步的
openai.ChatCompletion.create()改为异步调用await self.client.chat.completions.create()(注意API路径更新为OpenAI新的异步格式) - 使用
async for遍历流式响应,确保遍历过程不阻塞事件循环 - 保留
asyncio.create_task将任务提交到事件循环,让多个请求任务可以并行执行
验证效果
修改后,日志会呈现你期望的并行执行顺序:
Start 1 Start 2 End 1 # 或先输出End 2,取决于哪个请求先完成 End 2
内容的提问来源于stack exchange,提问作者Trong Lam Phan
相关产品推荐
相关产品推荐

