制作Twisted应用程序部分的策略或支持可重新加载?

时间:2010-01-08 07:28:12

标签: python twisted

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

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

反应堆是否有办法以与Paster的Reloadable HTTPServer类似的方式停止并重新启动?

2 个答案:

答案 0 :(得分:2)

使用Twisted发布的是twisted.python.rebuild模块,因此这可能是一个很好的起点。

另见这个问题:Checking for code changes in all imported python modules

答案 1 :(得分:1)

你可以写一些类似于贴纸重新加载器的东西,就像这样:

  1. 启动你的主要功能,在导入/使用任何扭曲的代码之前,fork / spawn一个子进程。
  2. 在子流程中,运行扭曲的应用程序。
  3. 在主进程中,运行检查已更改文件的代码。如果代码已更改,请重新加载子进程。
  4. 然而,这里的问题是,与开发网络服务器不同,大多数扭曲的应用程序有更多的状态,只是平坦的杀死/重启过程是一个坏主意,你可能会失去一些状态。

    有一种方法可以干净利落地完成:

    当你产生扭曲的应用程序时,使用subprocess.Popen()或类似的东西来获取stdin / stdout管道。现在在您的子进程中,使用扭曲的反应器来监听stdin(有扭曲的代码,请参阅twisted.internet.stdio,它允许您以通常的扭曲非阻塞方式使用与stdio传输通信的协议)。

    最后,当您决定重新加载时,请将某些内容写入子进程的stdin,告诉它要关闭。现在你扭曲的代码可以响应并优雅地关闭。一旦它干净地退出,你的主进程就可以再次生成它。

    (或者你可以使用信号来实现这一点,但这可能不是OS便携式)