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快速連接。