我需要使用gunicorn运行Django应用程序.我阅读文档,我认为我设置了所有应有的东西,但是当我运行时
gunicorn --worker-class socketio.sgunicorn.GeventSocketIOWorker app.wsgi:application
Run Code Online (Sandbox Code Playgroud)
我收到以下错误消息
2013-02-01 18:25:17 [25394] [INFO] Booting worker with pid: 25394
2013-02-01 18:25:18 [25394] [ERROR] Exception in worker process:
Traceback (most recent call last):
File ".../app-root/data/lib/python2.7/site-packages/gunicorn/arbiter.py", line 485, in spawn_worker
worker.init_process()
File ".../app-root/data/lib/python2.7/site-packages/gunicorn/workers/ggevent.py", line 131, in init_process
super(GeventWorker, self).init_process()
File ".../app-root/data/lib/python2.7/site-packages/gunicorn/workers/base.py", line 104, in init_process
self.run()
File ".../app-root/data/lib/python2.7/site-packages/socketio/sgunicorn.py", line 14, in run
self.socket.setblocking(1)
AttributeError: 'GeventSocketIOWorker' object has no attribute 'socket'
Traceback (most recent call last):
File ".../app-root/data/lib/python2.7/site-packages/gunicorn/arbiter.py", line 485, in spawn_worker
worker.init_process()
File ".../data/lib/python2.7/site-packages/gunicorn/workers/ggevent.py", line 131, …Run Code Online (Sandbox Code Playgroud) 因为几天我一直尝试在服务器端进行某种循环而不能成功地允许我定期更新客户端,但似乎如果你把一个循环放入服务器事件方法,它就会停止发送事件到客户端自动.我的直觉是"gevent"(或greenlets)不允许这种行为(只有客户端,使用socket.io的浏览器可以定期向服务器发出,而不是相反).我错了吗?你会如何解决这个问题?是否有可能,如果你做一个循环,与客户端(套接字)的连接会以某种方式丢失?我将附带一个小草案与模式.
// Client (socket.io) [Javascript]
client = io.connect('/space');
client.on('do_something', function (msg) {
// Do something.
});
client.on('do_another_thing', function (msg) {
// Do another thing.
});
client.emit('something', msg);
# Server (gevent-socketio) [Python]
@namespace('/space')
class SpaceNamespace:
def on_something(msg):
# This WORKS just fine cause it's out the scope of the loop.
self.emit('do_another_thing', some_operation(msg))
# This DOES NOT work.
while True:
# Each 3 seconds update the client.
self.emit('do_something', some_operation(msg))
time.sleep(3)
# If you put an ipdb here, you can see like the …Run Code Online (Sandbox Code Playgroud) 我正在选择一个python库来编写嵌入在我的网站中的实时聊天功能页面。
我发现基于Socket.IO,两个图书馆python-socketio和gevent-socketio:
Socket.IO实时服务器的Python实现。
Socket.IO是类似于WebSocket的抽象,可实现浏览器和服务器之间的实时通信。gevent-socketio是该协议的Python实现。
您会看到,它们都是Socket.IO的实现。
我想选择其中之一(或者是否有比我不知道的更好的库)。
我的考虑要点是:
我的python后端项目是由Django / Django-Rest-Framework框架编写的。
我的项目很着急,我想使用更方便的lib,编写更少的代码来实现我的要求。
我上网冲浪,gevent-socketio实时聊天必须使用gevent python WSGI服务器,我不确定这是否限制了我的项目部署。
谁能给我建议为我选择最佳图书馆?
我正在尝试通过基本命令在 docker 中使用flask socket.io。
当我运行gunicorn的单个工作人员时,一切工作正常,但是当我增加工作人员时,然后在客户端,它开始给出400错误请求,并且在服务器日志上,我看到无效的会话lWmxdNRmai59bRfLAAAA(此错误的进一步发生将记录为级别信息)。
这些是我正在使用的命令 Gunicorn --worker-class geventwebsocket.gunicorn.workers.GeventWebSocketWorker -w 2 application:app -b 0.0.0.0:5000
和application.py文件是
from gevent import monkey monkey.patch_all()
from flask import Flask from flask_socketio import SocketIO from flask import session
app = Flask(__name__)
app.config.from_object("settings.BaseConfig")
socket_app = SocketIO(
app,
cors_allowed_origins="*",
message_queue=settings.get_evn("CACHE_QUEUE_URL"),
async_mode="gevent",
)
socket_app.init_app(app, cors_allowed_origins="*")
Run Code Online (Sandbox Code Playgroud)
我正在使用 Redis 作为消息队列,并已验证消息队列 url 是否正确
使用aws负载均衡器来处理请求