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

树莓派PyQt5与Flask线程冲突:Flask子线程停止监听连接

解决PyQt5与Flask在树莓派上的共存问题

问题根源

你遇到的核心问题是Flask自带的开发服务器在子线程中运行时,和PyQt5的主线程事件循环存在资源竞争——尤其是debug=True模式会触发额外的线程管理逻辑,直接导致服务器无法持续监听新连接。另外你同时存在两种启动方式(Python线程脚本和bash后台启动),也可能造成运行冲突。

最优解决方案

1. 替换Flask开发服务器为生产级WSGI服务器

Flask自带的服务器仅用于开发调试,完全不适合多线程/多进程的稳定运行场景。推荐使用Waitress(纯Python实现,适配树莓派的轻量ARM环境):

  • 先安装Waitress:
    pip install waitress
    

2. 修改Python启动脚本

调整线程逻辑,关闭Flask的debug模式,用Waitress替代自带服务器,确保子线程稳定运行:

import threading
import json
from flask import Flask, request, jsonify
import gui

app = Flask(__name__)

# 你的Flask路由函数示例
@app.route('/status', methods=['GET'])
def get_status():
    return jsonify({"status": "running"})

def runServer():
    # 用Waitress启动服务器,替代原有的app.run
    from waitress import serve
    serve(app, host='192.168.1.142', port=5000)

# 设置Flask线程为非守护线程,确保主线程运行GUI时它不会被强制终止
t1 = threading.Thread(target=runServer, daemon=False)
t1.start()

# PyQt5 GUI必须在主线程启动,这里保持你的原有逻辑
gui.start()

3. 统一启动方式(二选一)

方式一:直接运行修改后的Python脚本

无需依赖bash脚本,直接执行:

python3 server.py

方式二:调整bash脚本启动Python程序

如果坚持用bash脚本,修改为以下内容(避免和Python线程逻辑重复启动服务器):

#!/bin/bash
export MIXER_PATH=/home/volume/RPi-VM-GUI/
cd $MIXER_PATH
python3 server.py &

注意:不要再使用flask run命令,否则会重复启动服务器,引发端口冲突或运行异常。

关键注意事项

  • PyQt5必须运行在主线程:Qt框架强制要求GUI事件循环在主线程执行,这一点不可更改,因此Flask必须放在子线程中运行。
  • 彻底禁用Flask的debug模式:debug模式会自动触发进程重启逻辑,在子线程环境下必然导致服务器崩溃或停止响应。
  • WSGI服务器选型:除了Waitress,也可以使用Gunicorn,但Waitress的纯Python实现更适配树莓派的轻量资源环境。

内容的提问来源于stack exchange,提问作者Open-Analysis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 22:10:20