添加OpenAI代码后Python服务请求时崩溃的问题排查
问题描述
原本正常运行的FastAPI服务(基于Gunicorn+Uvicorn部署),添加OpenAI相关代码后直接启动失败,客户端请求时无法连接服务器,报连接被拒绝错误。
原正常代码
from fastapi import FastAPI, Request from pydantic import BaseModel import uvicorn import os import importlib.util import sys app = FastAPI() beep = True @app.get('/') def get_func(): return {'text':'SLClient API active'}, 200 @app.post("/client/") async def get_body(dat: Request): dat = await dat.json() global beep if beep == True: os.system("/usr/bin/beep -f 2000 -l 20") try: if dat == None: return {'state':'error','e':'No data error'} else: if dat['jobid'] == "nobeep": beep = False return {'state':'complete','jobid':dat['jobid']} if dat['jobid'] == "beep": beep = True return {'state':'complete','jobid':dat['jobid']} if dat['jobid'] == "ping": return {'state':'complete','jobid':'0','text':'Pong'} else: return {'state':'complete','jobid':dat['jobid'],'text': dat['text'], 'username':dat['username'],'uid':dat['uid']} except Exception as e: return {'state':'error','e':str(e)}
修改后的代码(新增OpenAI调用)
from fastapi import FastAPI, Request from pydantic import BaseModel import uvicorn import os import importlib.util import sys import responses # 新增导入 app = FastAPI() beep = True @app.get('/') def get_func(): return {'text':'SLClient API active'}, 200 @app.post("/client/") async def get_body(dat: Request): dat = await dat.json() global beep if beep == True: os.system("/usr/bin/beep -f 2000 -l 20") try: if dat == None: return {'state':'error','e':'No data error'} else: if dat['jobid'] == "nobeep": beep = False return {'state':'complete','jobid':dat['jobid']} if dat['jobid'] == "beep": beep = True return {'state':'complete','jobid':dat['jobid']} if dat['jobid'] == "ping": return {'state':'complete','jobid':'0','text':'Pong'} if dat['jobid'] == "apiTest": try: responses.chat("test","test") # 调用自定义chat函数 return {'state':'complete','jobid':'0','text':'No problems'} except Exception as ex: return {'state':'error','e':str(ex)} else: return {'state':'complete','jobid':dat['jobid'],'text': dat['text'], 'username':dat['username'],'uid':dat['uid']} except Exception as e: return {'state':'error','e':str(e)}
自定义的responses.py(与主程序同目录)
import os import openai async def chat(prompt, sysmsg): openai.api_base = 'https://api.nova-oss.com/v1' openai.api_key = """##############################""" response = openai.ChatCompletion.create(model="gpt-3.5-turbo",messages=[{"role":"system", "content":sysmsg},{"role":"user", "content":prompt}]) result='' for choice in response.choices: result += choice.message.content return result
错误信息
客户端报错
HTTPConnectionPool(host='192.168.68.200', port=5000): Max retries exceeded with url: /client/ (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x0000022DCBF01F90>: Failed to establish a new connection: [WinError 10061] No connection could be made because the target machine actively refused it'))
服务器systemctl状态
× api.service - Gunicorn instance manager to serve API Loaded: loaded (/etc/systemd/system/api.service; static) Active: failed (Result: exit-code) since Tue 2023-10-24 17:28:21 UTC; 12min ago Process: 1300 ExecStart=/home/webserver/SLClient/client/bin/gunicorn api:app -w 4 -k uvicorn.workers.UvicornWorker -b 0.0.0.0:5000 (code=exited, status=3) Main PID: 1300 (code=exited, status=3) CPU: 6.767s Oct 24 17:28:21 sparklink-server gunicorn[1304]: [2023-10-24 17:28:21 +0000] [1304] [INFO] Worker exiting (pid: 1304) Oct 24 17:28:21 sparklink-server gunicorn[1300]: [2023-10-24 17:28:21 +0000] [1300] [ERROR] Worker (pid:1301) exited with code 3 Oct 24 17:28:21 sparklink-server gunicorn[1300]: [2023-10-24 17:28:21 +0000] [1300] [ERROR] Worker (pid:1304) was sent SIGTERM! Oct 24 17:28:21 sparklink-server gunicorn[1300]: [2023-10-24 17:28:21 +0000] [1300] [ERROR] Worker (pid:1303) was sent SIGTERM! Oct 24 17:28:21 sparklink-server gunicorn[1300]: [2023-10-24 17:28:21 +0000] [1300] [ERROR] Worker (pid:1302) was sent SIGTERM! Oct 24 17:28:21 sparklink-server gunicorn[1300]: [2023-10-24 17:28:21 +0000] [1300] [ERROR] Shutting down: Master Oct 24 17:28:21 sparklink-server gunicorn[1300]: [2023-10-24 17:28:21 +0000] [1300] [ERROR] Reason: Worker failed to boot. Oct 24 17:28:21 sparklink-server systemd[1]: api.service: Main process exited, code=exited, status=3/NOTIMPLEMENTED Oct 24 17:28:21 sparklink-server systemd[1]: api.service: Failed with result 'exit-code'. Oct 24 17:28:21 sparklink-server systemd[1]: api.service: Consumed 6.767s CPU time.
解决步骤
1. 修改脚本名解决模块命名冲突
自定义脚本responses.py与Python第三方库responses重名,会导致导入混淆。将该脚本重命名为openai_chat.py,并修改主程序中的导入语句:
# 替换原 import responses import openai_chat as responses
2. 安装缺失的依赖
responses.py中使用了openai库,若虚拟环境未安装该库,服务启动会失败。执行以下命令安装:
pip install openai
3. 异步函数调用添加await关键字
chat是用async定义的异步函数,调用时必须添加await,否则不会执行实际逻辑,还可能引发错误。修改主程序中的调用代码:
# 替换原 responses.chat("test","test") await responses.chat("test","test")
4. 可选:改用OpenAI异步客户端优化性能
当前使用的是OpenAI同步客户端,在FastAPI异步框架中,推荐使用异步客户端避免阻塞事件循环。修改改名后的openai_chat.py:
import os from openai import AsyncOpenAI async def chat(prompt, sysmsg): client = AsyncOpenAI( api_key="##############################", base_url="https://api.nova-oss.com/v1" ) response = await client.chat.completions.create( model="gpt-3.5-turbo", messages=[{"role":"system", "content":sysmsg},{"role":"user", "content":prompt}] ) result = response.choices[0].message.content return result
验证流程
- 完成脚本重命名与导入语句修改
- 安装
openai依赖 - 添加
await关键字完成异步调用 - 重启服务:
systemctl restart api.service - 检查服务状态:
systemctl status api.service,确认服务正常运行 - 重新发起请求测试
内容的提问来源于stack exchange,提问作者Proxy303
相关产品推荐
相关产品推荐

