使用ws4py套接字心跳创建CherryPy

时间:2013-06-24 15:18:38

标签: python callback cherrypy ws4py

我花了大约5个小时搜索如何做到这一点无济于事。

我们在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”值来完成的。

目前我只是向所有人播放心跳,我不喜欢个人的声音

1 个答案:

答案 0 :(得分:0)

只有在websocket对象执行了run方法时才会激活心跳(通常在线程中阻塞)。但是,由于各种原因,CherryPy插件不再使用该代码路径。我还没有决定如何处理心跳,因为,就目前而言,它必须在每个websocket的自己的线程中运行。我发现那种昂贵的记忆力。但是,如果确实需要该功能,请使用websocket实例创建Heartbeat类的实例。只需保留对每个Heartbeat实例的引用。