【问题标题】:cherrypy check connection status樱桃检查连接状态
【发布时间】:2013-01-23 04:08:15
【问题描述】:

我有一个cherrypy api,它打算在服务器上运行很长时间。

我有一个不可靠的客户端,它可能由于我无法控制的各种原因而死掉或关闭连接。

在我的服务器 api 运行期间,我想定期检查连接状态,确保客户端仍在侦听,并在客户端离开时中止我的操作。

我找不到任何描述如何在服务cherrypy请求时轮询连接状态的好地方。

这种长期运行的一个例子是在小缓冲区(内存有限)的块中计算多个大文件(数十 GB)的 md5。

我不需要任何缩短运行时间的解决方案,因为这不是我的目标。我想尽可能长时间地保持此连接打开,但如果它关闭则中止。

这是我的代码的简单示例:

@cherrypy.expose
def foo(self):
    cherrypy.response.headers['Content-Type'] = 'text/plain'
    def run():
        for result in get_results(): # get_results() is a heavy method mentioned
            yield json.dumps(result)
    return run()
foo._cp_config = {'response.stream': True}

【问题讨论】:

标签: python cherrypy


【解决方案1】:

知道客户端已经死亡的唯一可靠方法是尝试将一些数据写入套接字,对于 CherryPy 可以使用yield 完成。您必须生成非空字符串,因此您必须返回一个可以处理一些填充文本的 Content-Type,例如 HTML 文档的打开 <head> 标记之后的一些额外空格。如果客户端关闭连接,CherryPy 服务器将停止从处理程序请求额外的 yield 数据(并调用生成器上的任何 close 方法,以便您进行清理)。

【讨论】:

  • 我已经用示例代码更新了我的问题。我不确定我需要在哪里使用 close 方法才能进行清理。
  • 刚刚读完有关 yield 函数的内容。 fumanchu@ 是对的,当连接关闭时,cherrypy 确实会在生成器上调用 close,这就是我所需要的。
【解决方案2】:

据我所知,CherryPy 没有为您提供任何机制来检测客户死亡。它只会告诉您响应是否花费了太长时间才能完成(因此会被发送出去)。

您可以参考this SO thread了解更多信息。

【讨论】:

    猜你喜欢
    • 2016-03-11
    • 1970-01-01
    • 2011-01-02
    • 1970-01-01
    • 2010-09-18
    • 2012-12-07
    • 2012-07-06
    • 2011-12-06
    • 1970-01-01
    相关资源
    最近更新 更多