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
相关产品推荐
相关产品推荐

