首页 > 解决方案 > 如何停止 flask_socketio 设置 SO_REUSEPORT?

问题描述

如果我这样做,那么端口 8080 将被独占绑定并且尝试运行另一个实例将失败:

from flask import Flask

flask_app = Flask(__name__)
flask_app.run(port=8080)

如果我这样做,则SO_REUSEPORT设置了套接字选项,这意味着可以使用端口 8080 启动多个实例:

from flask import Flask
from flask_socketio import SocketIO

flask_app = Flask(__name__)
sio = SocketIO(flask_app)
sio.run(app=flask_app, port=8080)

这种SO_REUSEPORT套接字选项行为对于我的用例来说确实是相当不受欢迎的。有谁知道我怎么能阻止这个?

标签: pythonflaskflask-socketiopython-socketio

解决方案


我调查了一下,eventlet.listen确实有一个未记录的reuse_port参数。

flask_socketio维护者不想支持调用的服务器特定选项,SocketIO.run所以解决方案只能是在没有SocketIO.run. sio.run(app=flask_app, port=8080)没有 SSL 和错误处理但使用reuse_port我需要的参数的 eventlet 特定替换将是:

    addresses = eventlet.green.socket.getaddrinfo('127.0.0.1', 8080)

    sock = eventlet.listen(
        addresses[0][4],
        addresses[0][0],
        reuse_port=False,
    )

    eventlet.wsgi.server(sock, flask_app)

推荐阅读