我有一个在服务器上运行很长时间的cherrypy api。
我有一个不可靠的客户端,由于各种原因而无法控制或关闭连接。
在我的服务器api运行期间,我想定期检查连接的状态,确保客户端仍在监听并在客户端离开时中止我的操作。
我找不到任何描述如何在提供一个不满意的请求时轮询连接状态的好地方。
这种长期运行的一个例子是在小缓冲区(有限内存)中计算多个大文件(几十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}
答案 0 :(得分:2)
了解客户端已经死亡的唯一可靠方法是尝试将一些数据写入套接字,对于CherryPy可以使用yield
来完成。您必须生成非空字符串,因此您必须返回可以处理某些填充文本的Content-Type,例如HTML文档的打开<head>
标记后的一些额外空格。如果客户端关闭连接,CherryPy服务器将停止从处理程序请求其他生成的数据(并调用生成器上的任何close
方法,以便您可以清理)。
答案 1 :(得分:0)
据我所知,CherryPy没有为您提供检测客户端死机的任何机制。它只会告诉您响应是否花费太长时间才能完成(因此被发送出去)。
您可以参考this SO thread了解更多信息。