Django集成ChatGPT多连接卡顿求助:异步方案仍阻塞服务器
解决Django Channels结合ChatGPT调用时的服务器阻塞问题
问题根源
你当前用threading.Thread启动同步的ChatGPT API调用,本质还是同步IO操作——线程内的同步请求会占用ASGI服务器的worker资源,并发请求增多时,所有worker会被阻塞,导致服务器无法处理其他请求。另外,async_to_sync的使用会把异步Channels操作强制转为同步,进一步加剧阻塞。
解决方案步骤
1. 改用OpenAI异步客户端
使用OpenAI官方异步客户端,规避同步IO对线程的阻塞:
pip install openai[async]
2. 重构ChatGPT调用为异步函数
替换同步API调用逻辑,用异步方式请求OpenAI,并直接在异步上下文内发送Channels消息:
from openai import AsyncOpenAI import asyncio import json from channels.layers import get_channel_layer # 全局初始化异步客户端,避免重复创建连接池 client = AsyncOpenAI(api_key="你的OpenAI API密钥") async def async_call_gpt(prompt, model, context): try: # 异步调用ChatGPT API response = await client.chat.completions.create( model=model, messages=[{"role": "user", "content": prompt}] ) # 构造返回数据 json_data = { "status": "success", "content": response.choices[0].message.content.strip() } # 异步发送到Channels组,无需async_to_sync channel_layer = get_channel_layer() await channel_layer.group_send( f'user_{context["current_user"]}', {"type": "send_message", "text": json.dumps(json_data)} ) except Exception as e: # 异常处理,返回错误信息 error_data = {"status": "error", "message": str(e)} channel_layer = get_channel_layer() await channel_layer.group_send( f'user_{context["current_user"]}', {"type": "send_message", "text": json.dumps(error_data)} )
3. 在消费者/视图中启动异步任务
在Channels消费者或视图里,用asyncio.create_task启动异步任务,替代threading.Thread:
# 示例:在Channels消费者的异步方法中 async def your_consumer_method(self, event): prompt = event["text"] model = "gpt-4-0314" context = {"current_user": self.scope["user"].id} # 启动异步任务,立即返回不阻塞当前请求 asyncio.create_task(async_call_gpt(prompt, model, context)) # 可先返回"处理中"的响应给客户端 await self.send(text_data=json.dumps({"status": "processing"}))
4. 优化Daphne服务器配置
增加worker进程数量,分散并发负载:
daphne --ping-interval 10 --ping-timeout 600 --workers 4 -b 0.0.0.0 -p 8000 backend.gradingly.asgi:application
关键说明
- 异步IO不会占用线程等待网络响应,能极大提升服务器并发处理能力,多个ChatGPT请求可同时在后台等待响应,不阻塞其他请求。
- 异步上下文内直接用
await调用Channels的异步方法,避免使用async_to_sync。 - 全局初始化OpenAI异步客户端,减少重复创建HTTP连接的开销。
内容的提问来源于stack exchange,提问作者Aleem
相关产品推荐
相关产品推荐

