2013-05-15 67 views
1

我正在使用gevent運行一個燒瓶應用程序的socketio服務器。 My命名空間的代碼是在這裏:Socketio客戶端切換到xhr-polling與燒瓶運行應用程序

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中的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

想通了 - 我在ssh會話中通過命令行運行。結束會話會導致導致gevent無法正常工作的父進程。

在屏幕會話中分叉SocketIOServer進程修復了問題