调用openai.ChatCompletion.create()时Python程序间歇性挂起求助
解决OpenAI Python库
ChatCompletion.create()间歇性无响应挂起问题 在Windows 11 + Python 3.11.3 + openai v0.28.1环境下,调用openai.ChatCompletion.create()处理批量字符串时,会出现间歇性无限挂起:终端打印Sending API request...后无后续输出,既不返回结果也不抛出异常,Ctrl+C无法终止进程,只能关闭终端。已排除速率限制问题,通过sys.settrace确认挂起期间无代码执行。
可能原因分析
- 旧版openai库的底层HTTP客户端缺陷:v0.28.1依赖的
requests或urllib3在Windows环境下存在IO阻塞/死锁问题,导致请求发送后无法接收响应,进程陷入无状态挂起。 - Windows网络环境的间歇性拦截:防火墙、代理软件或网络运营商的动态流量管控,可能导致部分请求的TCP连接被静默阻断,无错误返回。
- GIL全局解释器锁阻塞:批量同步调用时,底层IO操作可能触发GIL的异常持有,导致整个Python进程无法响应信号(如
Ctrl+C)。
解决方法
1. 升级openai库到最新稳定版
旧版本的IO阻塞问题在后续版本中已被修复,执行升级命令:
pip install --upgrade openai
升级后(旧版v0.28.1也支持),直接在create方法中设置超时参数,避免无限挂起:
# 在use_gpt方法中修改调用代码 gpt_response = openai.ChatCompletion.create(**payload, timeout=30) # 设置30秒超时
2. 改用异步调用隔离IO操作
使用openai的异步客户端,避免同步调用阻塞整个进程,示例代码:
import asyncio import openai class AsyncGPTHandler: def __init__(self): # 加载配置逻辑 pass def _build_gpt_payload(self, string): # 构建请求payload的逻辑 return { "model": "gpt-3.5-turbo", "messages": [{"role": "user", "content": string}] } async def use_gpt_async(self, string_to_be_processed): payload = self._build_gpt_payload(string_to_be_processed) try: print("Sending API request...") gpt_response = await openai.ChatCompletion.acreate(**payload, timeout=30) print("API request complete.") return gpt_response except Exception as e: print(f"Exception: {e}") return None # 批量处理逻辑 async def process_strings(strings): handler = AsyncGPTHandler() tasks = [handler.use_gpt_async(s) for s in strings] await asyncio.gather(*tasks) if __name__ == "__main__": # 替换为实际数据集 strings = ["测试字符串1", "测试字符串2"] asyncio.run(process_strings(strings))
3. 隔离进程避免全局阻塞
使用multiprocessing库为每个请求单独创建进程,即使某个进程挂起,也不会影响主进程和其他请求:
from multiprocessing import Pool class GPTHandler: def __init__(self): # 加载配置逻辑 pass def _build_gpt_payload(self, string): return { "model": "gpt-3.5-turbo", "messages": [{"role": "user", "content": string}] } def use_gpt(self, string_to_be_processed): payload = self._build_gpt_payload(string_to_be_processed) try: print("Sending API request...") gpt_response = openai.ChatCompletion.create(**payload, timeout=30) print("API request complete.") return gpt_response except Exception as e: print(f"Exception: {e}") def process_single_string(string): handler = GPTHandler() return handler.use_gpt(string) if __name__ == "__main__": strings = ["测试字符串1", "测试字符串2"] # 根据CPU核心数设置进程数 with Pool(processes=4) as pool: pool.map(process_single_string, strings)
4. 排查网络环境
- 临时关闭Windows防火墙、第三方安全软件,测试是否还会出现挂起。
- 若使用代理,尝试关闭代理或切换到全局代理,排查代理的间歇性故障。
进一步调试建议
1. 启用openai调试日志
查看底层HTTP请求的详细过程,定位挂起阶段:
import openai openai.log = "debug" # 启用调试日志
日志会输出请求的URL、头部、发送数据及响应状态,若挂起,可看到请求卡在发送或等待响应阶段。
2. 抓包分析网络流量
使用Wireshark抓取与api.openai.com的TCP流量,确认:
- 请求是否成功发送到服务器。
- 服务器是否返回响应。
- 是否存在TCP连接异常(如重置、超时)。
3. 自定义HTTP客户端配置
针对旧版openai库,手动配置requests.Session并设置超时和重试策略:
import requests import openai session = requests.Session() session.timeout = 30 # 全局超时 openai.aiosession.set(session) # 绑定到openai客户端
内容的提问来源于stack exchange,提问作者low_static
相关产品推荐
相关产品推荐

