【问题标题】:Strategies or support for making parts of a Twisted application reloadable?使 Twisted 应用程序的某些部分可重新加载的策略或支持?
【发布时间】:2010-01-08 07:28:12
【问题描述】:

我已经编写了一个专门的 JSON-RPC 服务器,并且刚刚开始进入应用程序逻辑,发现不断地停止/重新启动服务器以进行某些更改有点烦人。

以前我有一个处理程序,它会间隔运行以将模块修改的时间戳与过去的检查进行比较,然后根据需要重新加载模块。不幸的是,我不相信它现在可以正常工作。

有没有办法让反应器以类似于 Paster 的 Reloadable HTTPServer 的方式停止和重新启动自己?

【问题讨论】:

  • 我目前正在尝试 Crast 和 clemesha 的答案...将更新我的问题并尽快为我的情况挑选获胜者。
  • 您知道在搜索问题时遇到了麻烦,然后回到您 3 年前提出的问题。

标签: python twisted


【解决方案1】:

Twisted 附带的是twisted.python.rebuild 模块,所以这可能是一个不错的起点。

另请参阅这个 SO 问题:Checking for code changes in all imported python modules

【讨论】:

  • 它并不完美,但 twisted.python.rebuild 似乎适合我的情况。
【解决方案2】:

你可以写一些类似于 paster 的 reloader 的东西,它会像这样工作:

  1. 启动您的主函数,然后在导入/使用任何扭曲的代码之前,分叉/生成一个子进程。
  2. 在子进程中,运行您的扭曲应用程序。
  3. 在主进程中,运行检查更改文件的代码。如果代码已更改,请重新加载子进程。

然而,这里的问题是,与开发网络服务器不同,大多数扭曲的应用程序有更多的状态,并且直接杀死/重新启动进程是一个坏主意,您可能会丢失一些状态。

有一个干净的方法:

当您生成扭曲的应用程序时,使用subprocess.Popen() 或类似名称来获取标准输入/标准输出管道。现在在您的子进程中,使用 twisted reactor 监听 stdin(在 twisted 中有用于此的代码,请参阅twisted.internet.stdio,它允许您拥有一个以通常的扭曲非阻塞方式与 stdio 传输通信的协议)。

最后,当您决定是时候重新加载时,向子进程的标准输入写入一些内容,告诉它关闭。现在你的扭曲代码可以优雅地响应和关闭。一旦它彻底退出,您的主进程就可以再次生成它。

(或者您可以使用信号来实现这一点,但这可能不是操作系统可移植的)

【讨论】:

  • 我认为你的计划可能是我能采取的最简单的路径。
猜你喜欢
  • 2014-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-15
  • 2020-06-27
  • 2012-05-19
  • 2017-02-28
  • 2018-10-02
相关资源
最近更新 更多