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