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

Flask+Gunicorn多用户音频转录结果混淆问题求助

解决Flask音频转录应用多用户结果混淆问题

问题根源

你遇到的核心问题不是Gunicorn配置错误,而是Flask应用本身存在线程不安全的共享状态。Flask默认的请求处理模式下,如果使用全局变量存储请求相关的中间数据(比如待处理的音频文件、转录结果),当多线程/多Worker并发处理请求时,这些全局变量会被不同请求互相覆盖,最终导致用户收到不属于自己的结果。

解决方案

1. 移除全局变量,使用请求上下文隔离状态

将所有与单个请求相关的变量(如音频数据、转录结果)迁移到Flask的g对象中,g是每个请求独有的上下文对象,不会在请求间共享。

错误示例(使用全局变量):

# 错误:全局变量会被并发请求覆盖
current_audio = None
current_transcript = None

@app.route('/transcribe', methods=['POST'])
def transcribe():
    global current_audio, current_transcript
    current_audio = request.files['audio']
    # 调用OpenAI转录
    current_transcript = openai.Audio.transcribe("whisper-1", current_audio)
    return jsonify(current_transcript)

修正示例(使用g对象):

from flask import g

@app.route('/transcribe', methods=['POST'])
def transcribe():
    audio_file = request.files['audio']
    # 将音频对象绑定到当前请求上下文
    g.audio_file = audio_file
    # 调用OpenAI转录,结果直接返回,不存储到全局
    transcript = openai.Audio.transcribe("whisper-1", g.audio_file)
    return jsonify(transcript)

2. 确保OpenAI客户端的线程安全

如果你的代码中全局初始化了OpenAI客户端,部分SDK版本可能存在线程安全问题。建议:

  • 每个请求内创建独立的OpenAI客户端实例
  • 或使用threading.local()存储客户端,确保每个线程有独立的客户端实例

示例:

import threading
from openai import OpenAI
import os

# 线程本地存储,每个线程有独立的客户端
local_storage = threading.local()

def get_openai_client():
    if not hasattr(local_storage, 'client'):
        local_storage.client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))
    return local_storage.client

@app.route('/transcribe', methods=['POST'])
def transcribe():
    client = get_openai_client()
    audio_file = request.files['audio']
    transcript = client.audio.transcribe("whisper-1", audio_file)
    return jsonify(transcript)

3. 优化Gunicorn配置(辅助优化)

基于你8vCore CPU、8GB内存的配置,推荐以下Gunicorn配置,兼顾并发能力和资源利用率:

web: gunicorn main:app --workers 4 --threads 2 --timeout 300
  • --workers 4:Worker数量设置为CPU核心数的一半,避免过度占用内存,也可根据实际负载调整为8
  • --threads 2:每个Worker开启2个线程,利用多核的同时减少上下文切换开销
  • --timeout 300:设置5分钟超时,足以处理较长音频的转录任务

验证方案

部署修改后的代码后,可通过以下方式验证:

  • 同时用多个浏览器窗口或不同设备上传不同音频
  • 检查每个请求返回的转录结果是否与对应上传的音频匹配

内容的提问来源于stack exchange,提问作者Satyam Singh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 00:13:17