代码之家  ›  专栏  ›  技术社区  ›  David

策略或支持使扭曲应用程序的某些部分可重新加载?

  •  3
  • David  · 技术社区  · 14 年前

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

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

    有没有一种方法可以让反应堆以类似于巴斯德的可重新加载的httpserver的方式停止和重启?

    2 回复  |  直到 14 年前
        1
  •  2
  •   Community Egal    7 年前

    与Twisted一起装运的是 twisted.python.rebuild 模块,所以这可能是一个很好的开始。

    另请参见此问题: Checking for code changes in all imported python modules

        2
  •  1
  •   Crast    14 年前

    你可以写一些类似于巴斯德的重载程序的东西,工作原理如下:

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

    然而,这里的问题是,与开发Web服务器不同,大多数扭曲的应用程序都有更多的状态,只是简单地终止/重新启动进程是一个坏主意,您可能会失去一些状态。

    有一种干净的方法:

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

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

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