用ws4py套接字心脏创建一个CherryPy

2024-06-26 04:05:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我花了大约5个小时寻找如何做到这一点,但没有结果。在

我们在cherrypy上使用ws4py。目前,当一个连接在物理上丢失时(比如关闭WiFi),连接将不会终止,直到从服务器发送消息,此时它会检测到断开的线路并清理套接字。在

这给我们带来了问题,我们需要尽快知道插座是否消失。在

文件“websocket.py在ws4py中有一个名为“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回调系统捆绑在一起。这是我发现的

上面的CTR从“cherrypyserver.py“在功能上

^{pr2}$

此函数似乎是一个回调函数,因为它是从调用的_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,

    }

我相信在这个“根地图”的某个地方,我必须指定参数。有人知道怎么做吗。在

为了澄清,我希望我的服务器为每个对等机创建一个心跳。我相信这是通过传递“heartbeat_freq”值来实现的。在

目前我只是在向所有人广播心跳,我个人不喜欢这种声音


Tags: 实例函数代码pyselfnone参数def
1条回答
网友
1楼 · 发布于 2024-06-26 04:05:59

只有当websocket对象的run方法被执行时(通常在线程中阻塞时),心跳才会被激活。但是CherryPy插件由于各种原因不再使用该代码路径。我还没有决定如何处理heartbeat,因为就目前的情况来看,它必须在每个websocket的自己的线程中运行。我觉得昂贵的记忆是明智的。但是,如果确实需要该特性,请使用websocket实例创建Heartbeat类的实例。只需保存对每个Heartbeat实例的引用。在

相关问题 更多 >