我有一个内部的cherrypy服务器,它提供静态文件并回答XMLRPC请求。一切正常,但每天1-2次我需要更新这个静态文件和数据库。当然我可以停止服务器,运行更新并启动服务器。但这不是很干净,因为通过XMLRPC与服务器通信的所有其他代码都将断开连接,用户将在broswers中看到“无法连接”。这增加了额外的复杂性 - 我需要一些外部启动/停止/更新代码,所有更新都可以在cherrypy服务器本身内完美地完成。
是否有可能以某种方式“暂停”樱桃编程,因此它将服务静态“忙”页面,我可以更新数据,而不用担心现在有人从服务器下载文件A,我将更新他想要的文件B,所以他将获得不同的文件版本。
我试图以编程方式实现此功能,但这里存在问题。 Cherrypy是多线程的(这很好),所以即使我引入了一个全局的“忙”标志,我还需要一些方法来等待所有线程在我可以更新数据之前完成现有的任务。找不到这样的方式:(。
答案 0 :(得分:2)
CherryPy的引擎控制着这样的事情。当您调用engine.stop()
时,HTTP服务器将关闭,但首先会等待现有请求完成。此模式旨在允许在不提供请求时进行调试。见this state machine diagram。请注意,stop
与exit
不同,stop
确实会停止所有内容并退出流程。
您可以拨打engine.start()
,然后使用其他应用再次手动启动HTTP服务器以提供“忙碌”页面,然后进行编辑,然后停止临时服务器,然后拨打engine.block()
并再次{{1}}并继续前进。请注意,这将意味着当前请求完成并且新的HTTP服务器接管侦听套接字时会有一定的停机时间,但这将保证在您开始进行更改之前完成所有当前请求。
或者,您可以编写一些WSGI中间件,这些中间件通常会通过不变的方式传递请求,但是当tripped返回“忙”页面时。目前的请求仍然可以完成,因此可能会有一段时间您不确定您的编辑是否会影响正在进行的请求。如何编写WSGI中间件在SO回复中不太合适;搜索this one等资源。当您准备将其连接到CherryPy时,请参阅http://docs.cherrypy.org/dev/concepts/config.html#wsgi