2013-06-24 56 views
0

我花了大約5個小時尋找如何做到這一點無濟於事。使用ws4py插槽創建CherryPy心跳

我們在cherrypy上使用ws4py。在目前,當一個連接丟失(例如關閉WiFi)時,連接將不會終止,直到從服務器發送一條消息,此時它會檢測到丟棄的線路並清除套接字。

這是導致我們遇到的問題,我們需要知道更快,如果套接字走了。

ws4py中的文件「websocket.py」有一個名爲「Heartbeat」的類,它看起來正是我想要的,我相信如果它的參數「heartbeat_freq」傳遞了,就會在「WebSocket」內創建一個實例在;

class WebSocket(object): 
""" Represents a websocket endpoint and provides a high level interface to drive the endpoint. """ 

    def __init__(self, sock, protocols=None, extensions=None, environ=None, heartbeat_freq=None): 

上面是ws4py ctor,但是我找不到從哪裏調用這段代碼。我所知道的是它被捆綁在一個CherryPy回調系統中。這是我發現的;

上述ctor從函數中的「cherrypyserver.py」中調用;

def upgrade(self, protocols=None, extensions=None, version=WS_VERSION, handler_cls=WebSocket, heartbeat_freq=None): 

這個功能似乎是一個回調,因爲它是從_cprequest.py在功能

def __call__(self): 
    """Run self.callback(**self.kwargs).""" 
    return self.callback(**self.kwargs) 

現在有更多的東西,左右浮動,但誠實我有點失去了所謂的,並認爲我正在討論這個錯誤。

從我所知道的,我需要設置回調的「heartbeat_freq」參數,但不知道我將設置此參數的位置。下面的代碼是我指定回調創建實例的「WebSocket」處理程序類(websocket2.Handler繼承自「WebSocket」)的地方。

rootmap2={ 
    'wsgi.pipeline': [ 
     ('validator1', validator), 
     ('validator2', validator), 
     ] , 
     'tools.websocket.on': True, 
     'tools.websocket.handler_cls': websocket2.Handler, 

    } 

我相信在這個「rootmap」的某個地方我必須指定參數。有人知道怎麼做這個嗎。

爲了澄清,我希望我的服務器爲每個對等點創建一個心跳線。我相信這是通過傳遞「heartbeat_freq」值來完成的。

在目前我只是廣播心跳所有,這是我不喜歡的個人

回答

0

聲音心跳纔會被激活時,WebSocket的對象有執行(通常在一個線程作爲它的阻止)它的run方法。然而,CherryPy插件由於各種原因不再使用該代碼路徑。我還沒有決定怎麼處理心跳,因爲現在,它必須在每個websocket的自己的線程中運行。我發現昂貴的記憶方式。但是,如果您確實需要該功能,請使用websocket實例創建Heartbeat類的實例。只需持有對每個Heartbeat實例的參考。