我正在使用gevent运行带有烧瓶应用程序的socketio服务器。我的命名空间代码在这里:
class ConversationNamespace(BaseNamespace):
def __init__(self, *args, **kwargs):
request = kwargs.get('request', None)
if request:
self.current_app = request['current_app']
self.current_user = request['current_user']
super(ConversationNamespace, self).__init__(*args, **kwargs)
def listener(self):
r = StrictRedis(host=self.current_app.config['REDIS_HOST'])
p = r.pubsub()
p.subscribe(self.current_app.config['REDIS_CHANNEL_CONVERSATION_KEY'] + self.current_user.user_id)
conversation_keys = r.lrange(self.current_app.config['REDIS_CONVERSATION_LIST_KEY'] +
self.current_user.user_id, 0, -1)
# Reverse conversations so the newest is up top.
conversation_keys.reverse()
# Emit conversation history.
pipe = r.pipeline()
for key in conversation_keys:
pipe.hgetall(self.current_app.config['REDIS_CONVERSATION_KEY'] + key)
self.emit(self.current_app.config['SOCKETIO_CHANNEL_CONVERSATION'] + self.current_user.user_id, pipe.execute())
# Listen for new conversations..
for m in p.listen():
conversation = r.hgetall(self.current_app.config['REDIS_CONVERSATION_KEY'] + str(m['data']))
self.emit(self.current_app.config['SOCKETIO_CHANNEL_CONVERSATION'] +
self.current_user.user_id, conversation)
def on_subscribe(self):
self.spawn(self.listener)
我在我的应用程序中注意到,当我第一次启动SocketIO服务器(下面的代码)时,客户端可以通过firefox和chrome中的websocket进行连接
#!vendor/venv/bin/python
from gevent import monkey
monkey.patch_all()
from yellowtomato import app_instance
import werkzeug.serving
from socketio.server import SocketIOServer
app = app_instance('sockets')
@werkzeug.serving.run_with_reloader
def runServer():
SocketIOServer(('0.0.0.0', app.config['SOCKET_PORT']), app, resource='socket.io').serve_forever()
runServer()
一段时间后(可能一个小时左右),当我尝试通过浏览器客户端连接到该命名空间时,它不再与websocket通信,而是与xhr-polling通信。此外,在第一个响应来自服务器之前大约需要20秒。它让最终用户感觉事情变得非常缓慢(但只有在第一个子网上呈现页面时,xhr轮询才会频繁发生,事件会及时推送到客户端)。
什么是触发此延迟,以及如何确保客户端使用websockets快速连接。
答案 0 :(得分:0)
想出来 - 我在ssh会话中通过命令行运行。结束会话会导致父进程死亡,导致gevent无法正常工作。
在屏幕会话中分叉SocketIOServer进程修复了问题