2

我正在使用 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 轮询频繁发生并且事件被及时推送到客户端)。

是什么触发了这种延迟,我如何确保客户端使用 websocket 快速连接。

4

1 回答 1

-1

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

在屏幕会话中分叉 SocketIOServer 进程解决了问题

于 2013-05-21T17:49:12.040 回答