【问题标题】:How to write python code that can be self-updated without need to quit application?如何编写无需退出应用程序即可自行更新的python代码?
【发布时间】:2016-04-04 11:31:59
【问题描述】:

在python中创建高度集成的代码很容易,因此在代码更改时需要退出并重新启动应用程序是可以理解的。

但是,它肯定必须存在一些策略和模型,以便能够隔离部分代码,以便可以即时更新而无需退出和重新启动。

对于我正在开发的应用程序,许多功能将是独立的后台任务,主应用程序将与之对话,提供状态信息,并根据当前状态指示执行任务。在许多方面,这些后台任务可以被视为独立程序,只是它们与主应用程序和其他构建在其之上的工具、任务等共享一些代码库。

虽然可能很难让整个 shebang 实时更新,但我确信必须有一些方法可以推出更新并让正在运行的代码根据需要通知和更新自身。

由于我也热衷于利用多线程和异步(在 Python 3.5 中)以及探索使事物无状态,因此在逻辑上似乎可以在这里做一些有趣的事情,至少可以避免一些强制推出新代码时硬重启。

非常感谢您提供有关如何使其工作的提示和指针。

【问题讨论】:

  • 您可能对this question感兴趣
  • 感谢@CoryKramer,这正是我正在寻找的信息。太棒了,这可能比我最初想象的要容易:)
  • 我相信flask和tornado都有这样的特性,所以你也可以看看他们的代码。
  • 感谢@dano,Flask 是我正在寻找的几个项目的候选微框架之一,因此这使它变得更加有趣。

标签: python multithreading python-asyncio stateless python-3.5


【解决方案1】:

有一个内置函数reload() 会重新加载一个模块,但很容易搞砸。您必须非常小心保存对旧版本模块创建的对象的引用,然后确保在重新加载模块时替换它们。

我经常使用 Django,当它以调试模式运行其 Web 服务器时,只要源文件发生更改,它就会重新加载整个 Web 服务器进程。这是手动重启和重新加载单个模块之间的一个很好的折衷方案。

我没有使用它,但watchdog 可能有助于监控文件系统的更改以触发重新加载。

【讨论】:

    猜你喜欢
    • 2010-11-14
    • 2019-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 2011-04-29
    相关资源
    最近更新 更多