Socketio客户端切换到使用烧瓶app运行的xhr-polling

时间:2013-05-15 02:16:07

标签: python flask gevent gevent-socketio socket.io

我正在使用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快速连接。

1 个答案:

答案 0 :(得分:0)

想出来 - 我在ssh会话中通过命令行运行。结束会话会导致父进程死亡,导致gevent无法正常工作。

在屏幕会话中分叉SocketIOServer进程修复了问题