2

我有一个内部的cherrypy 服务器,它提供静态文件并回答 XMLRPC 请求。一切正常,但我需要每天 1-2 次更新这个静态文件和数据库。当然我可以停止服务器,运行更新并启动服务器。但这不是很干净,因为通过 XMLRPC 与服务器通信的所有其他代码都会断开连接,并且用户会在浏览器中看到“无法连接”。这增加了额外的复杂性 - 我需要一些外部启动/停止/更新代码,所有更新都可以在cherrypy服务器本身内完美完成。

是否有可能以某种方式以某种方式“暂停”cherrypy,以便它将服务器静态“忙碌”页面,我可以更新数据而不必担心现在有人正在从服务器下载文件 A,我将更新他想要的文件 B,所以他会得到不同的文件版本。

我试图以编程方式实现这一点,但这里有问题。Cherrypy 是多线程的(这很好),所以即使我引入了全局“忙碌”标志,我也需要一些方法来等待所有线程完成现有任务,然后才能更新数据。找不到这样的方式:(。

4

1 回答 1

2

CherryPy 的引擎控制这些东西。当您调用engine.stop()时,HTTP 服务器会关闭,但首先它会等待现有请求完成。此模式旨在允许在不服务请求时进行调试。请参阅此状态机图。请注意,它stopexit真正停止一切并退出进程的 不同。

您可以调用stop,然后使用不同的应用程序再次手动启动 HTTP 服务器以提供“忙碌”页面,然后进行编辑,然后停止临时服务器,然后再次调用engine.start()engine.block()继续前进。请注意,当当前请求完成并且新的 HTTP 服务器接管对套接字的侦听时,这将意味着一定量的停机时间,但这将保证在您开始进行更改之前完成所有当前请求。

或者,您可以编写一些 WSGI 中间件,该中间件通常将请求原封不动地传递,但当被触发时返回“忙碌”页面。当前请求仍将被允许完成,因此您可能会在一段时间内不确定您的编辑是否会影响正在进行的请求。如何编写 WSGI 中间件不太适合 SO 回复;搜索类似这样的资源。当您准备好在 CherryPy 中连接它时,请参阅http://docs.cherrypy.org/dev/concepts/config.html#wsgi

于 2012-12-18T16:30:31.153 回答