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

调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 21:14:56