flask_socketio使用任何消息队列作为socketio参数挂起

flask_socketio使用任何消息队列作为socketio参数挂起,flask,flask-socketio,Flask,Flask Socketio,给出以下示例,根据文档,这是一个非常简单的示例。我使用redis或任何其他提供程序作为消息队列时出错。不过,如果我只是将message_queue设置为None(取消对行的注释),浏览器将挂起。一切正常。另外,我在Environment上安装了kombu、redis和eventlet包pip。使用烧瓶socketio==4.2.1 from flask import Flask, jsonify from flask_socketio import SocketIO, emit messag

给出以下示例,根据文档,这是一个非常简单的示例。我使用redis或任何其他提供程序作为消息队列时出错。不过,如果我只是将message_queue设置为None(取消对行的注释),浏览器将挂起。一切正常。另外,我在Environment上安装了kombu、redis和eventlet包pip。使用烧瓶socketio==4.2.1

from flask import Flask, jsonify
from flask_socketio import SocketIO, emit


message_queue = "redis://127.0.0.1:6379"
# message_queue = None


app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret!'
socketio = SocketIO(app,
                    async_mode='eventlet',
                    message_queue=message_queue,
                    manage_session=False,
                    logger=True,
                    engineio_logger=True)


@app.route('/')
def home():
    return """
        <html>
        <body>
        <script src="//cdnjs.cloudflare.com/ajax/libs/socket.io/2.2.0/socket.io.js" integrity="sha256-yr4fRk/GU1ehYJPAs8P4JlTgu0Hdsp4ZKrx8bDEDC3I=" crossorigin="anonymous"></script>
        <script type="text/javascript" charset="utf-8">
        var socket = io();
        socket.on('connect', function() {
            socket.emit('my event', {data: 'Im connected!'});
        });

        socket.on('my response', function(data) {
            console.log(data);
        });
        </script>
        ok
        </body>
        </html>
    """

@socketio.on('my event')
def test_message(message):
    emit('my response', {'data': 'got it!'})
使用rabbit mq,我从rabbit获得了数千个日志:

rabbit_1         | 2020-02-18 20:47:16.535 [info] <0.18859.0> accepting AMQP connection <0.18859.0> (172.31.0.1:46412 -> 172.31.0.6:5672)
rabbit_1         | 2020-02-18 20:47:16.581 [info] <0.18859.0> connection <0.18859.0> (172.31.0.1:46412 -> 172.31.0.6:5672): user 'rabbitmq' authenticated and granted access to vhost '/'

说明了整个示例脚本。如果你能使它正常运行,请发表评论。谢谢。

我猜这是因为现在已经对标准库monkey进行了修补,以便与eventlet兼容。在脚本的两行添加以下两行:

导入eventlet
eventlet.monkey_patch()
从烧瓶导入烧瓶,jsonify
从flask_socketio导入socketio,发射
消息队列=”redis://127.0.0.1:6379"
#消息队列=无
# ...
有关猴子修补的更多信息,请参阅

我还需要在底部添加
run()
调用,您在清单中忽略了这一点:

socketio.run(应用程序)

通过这两个更改,我可以运行Python脚本,而不会挂起任何东西。我怀疑您可能一直在使用
flaskrun
来运行服务器,但这不是启动eventlet服务器的方法,它只适用于flaskdev服务器。您必须使用
socketio.run(app)
才能正确启动eventlet服务器。

感谢您回答Miguel,alghough的问题。即使在eventlet补丁之后。我还是犯了同样的错误。修补没有造成任何影响。你成功运行代码了吗?谢谢miguel。成功了。问题不在于脚本本身。我有一个模块,带有脚本和一个执行socketio.run(应用程序)的.u main.py文件。eventlet补丁必须在那里完成,这就是问题所在。感谢并祝贺这个项目。
rabbit_1         | 2020-02-18 20:47:16.535 [info] <0.18859.0> accepting AMQP connection <0.18859.0> (172.31.0.1:46412 -> 172.31.0.6:5672)
rabbit_1         | 2020-02-18 20:47:16.581 [info] <0.18859.0> connection <0.18859.0> (172.31.0.1:46412 -> 172.31.0.6:5672): user 'rabbitmq' authenticated and granted access to vhost '/'
import eventlet
eventlet.monkey_patch()