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

如何在uWSGI多Worker间共享Django的stream模块避免重复初始化

解决Django+uWSGI多Worker重复初始化摄像头模块的问题

问题本质

uWSGI的每个Worker都是独立的操作系统进程,Python模块会在每个进程启动时被导入并执行初始化逻辑,所以你的stream模块会被每个Worker重复加载,导致多个进程同时尝试打开同一摄像头,引发资源冲突。

可行解决方案

1. 单Worker进程(临时应急方案)

直接限制uWSGI只启动1个Worker,这样整个应用只会初始化一次stream模块,避免多进程抢占摄像头。但此方案无法利用多核CPU,高并发场景下性能会受限。

  • uWSGI配置示例:
uwsgi --http :8000 --module your_project.wsgi --workers 1

2. 抽离摄像头流为独立服务(推荐生产环境)

将摄像头采集逻辑从Django应用中分离,做成独立的后台服务,Django的所有Worker仅作为客户端请求该服务获取流数据,彻底避免多进程抢占硬件资源。

实现步骤:

  • 第一步:编写独立摄像头服务(以FastAPI为例,异步处理多连接)
import cv2
from fastapi import FastAPI, Response
import asyncio

app = FastAPI()
# 全局初始化摄像头,仅执行一次
camera = cv2.VideoCapture(0)

async def generate_frames():
    while True:
        success, frame = camera.read()
        if not success:
            break
        # 编码为JPEG格式
        ret, buffer = cv2.imencode('.jpg', frame)
        frame_bytes = buffer.tobytes()
        # 生成符合流媒体格式的响应片段
        yield (b'--frame\r\n'
               b'Content-Type: image/jpeg\r\n\r\n' + frame_bytes + b'\r\n')
        await asyncio.sleep(0.01)

@app.get("/video_feed")
async def video_feed():
    return Response(
        generate_frames(),
        media_type="multipart/x-mixed-replace;boundary=frame"
    )
  • 第二步:启动独立服务
    使用uvicorn运行该服务:
uvicorn camera_service:app --host 0.0.0.0 --port 8001
  • 第三步:修改Django的stream模块
    不再直接操作摄像头,改为请求独立服务的流接口:
import requests

def video_camera_feed():
    # 请求独立摄像头服务的流
    response = requests.get('http://localhost:8001/video_feed', stream=True)
    for chunk in response.iter_content(chunk_size=1024):
        if chunk:
            yield chunk

同时更新views.py中的调用逻辑,指向新的video_camera_feed()方法即可。

3. uWSGI进程间共享资源(复杂进阶方案)

利用uWSGI的共享内存、进程间通信(IPC)机制,让所有Worker共享同一个摄像头资源句柄,同时需要添加锁机制避免并发竞争。但此方案实现复杂,对进程模型理解要求高,容易出现死锁、资源泄漏问题,不推荐新手使用。

额外优化:解决多用户连接问题

你提到单Worker时多用户连接也存在异常,这是因为原feed()方法是单线程逻辑,无法同时处理多个客户端请求。采用独立异步服务的方案后,FastAPI的异步特性可以天然支持多并发连接,直接解决该问题。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 22:33:32