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

Flask+SocketIO程序启动即终止,如何同时运行Web与SocketIO服务器?

解决Flask-SocketIO服务器启动后立即退出的问题

嘿,我来帮你搞定这个问题!你的脚本启动后秒退,核心原因是:主线程在启动后台任务后没做任何阻塞操作,直接就执行完退出了,后台的SocketIO服务器进程也跟着被终止了。下面给你两种靠谱的修复方案:

方案一:直接启动服务器(官方推荐的常规操作)

其实完全没必要用后台任务包装,socketio.run()本身就是个阻塞方法,会一直维持服务器运行,这也是官方最提倡的启动方式。顺便给你加上常用的配置参数,比如指定端口、允许跨域啥的:

from flask import Flask
from flask_socketio import SocketIO, send

app = Flask(__name__)
# 可选:加上cors参数避免前端连接时的跨域报错
socketio = SocketIO(app, cors_allowed_origins="*")

@socketio.on('message')
def handleMessage(msg):
    print('Message: ' + msg)
    # 可选:如果需要把消息广播给所有在线客户端,加上broadcast=True
    send(msg)

if __name__ == '__main__':
    # 手动指定端口(比如5000)、允许外部访问(host=0.0.0.0),debug模式开发时用很方便
    socketio.run(app, host='0.0.0.0', port=5000, debug=True)

方案二:让主线程保持运行(如果必须用后台任务)

要是你确实需要把服务器放在后台任务里跑,那得给主线程加个“锁”,不让它随便退出。可以用死循环加sleep,或者直接用SocketIO自带的wait()方法:

from flask import Flask
from flask_socketio import SocketIO, send
import time

app = Flask(__name__)
socketio = SocketIO(app)

def run_server():
    socketio.run(app, host='0.0.0.0', port=5000)

@socketio.on('message')
def handleMessage(msg):
    print('Message: ' + msg)
    send(msg)

if __name__ == '__main__':
    socketio.start_background_task(run_server)
    # 方法1:用死循环让主线程持续运行
    while True:
        time.sleep(1)
    # 方法2:用SocketIO自带的wait方法更简洁
    # socketio.wait()

几个关键细节提醒

  • socketio.run()默认会占用5000端口,想换的话直接在参数里改port=xxx就行,比如port=8080。
  • host='0.0.0.0'能让服务器接受外部设备的连接,不然只能在本地localhost访问。
  • debug=True在开发时开着很方便,代码改了会自动重载,但生产环境一定要关掉。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:33:14