1

我有一个旨在在服务器上运行很长时间的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}
4

2 回答 2

2

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

于 2013-01-23T15:51:56.583 回答
0

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

您可以参考这个 SO 线程以获取更多信息。

于 2013-01-23T13:06:04.817 回答