【发布时间】:2015-11-19 22:53:12
【问题描述】:
我觉得我应该在这个问题前加上以下陈述:我知道在 python 中重新加载模块是不受欢迎的。我更多的是在修补 Python 并做一些事情来证明我可以。
假设我在主文件中有这段代码:
def reloadFoo():
lastReloadedTime = time.time()
while True:
if os.stat(foo.__file__).st_mtime > lastReloadedTime:
lastReloadedTime = time.time()
reload(foo)
而 foo.py 包含
def printMe():
print "Yo ho yo ho"
如果我调用reloadFoo(),如果它自上次重新加载后被修改过,它将永远重新加载模块。但是我如何使它作为某种背景功能工作呢?
我研究了多处理,所以我在 main 中有这样的东西:
import foo
def reloadFoo():
....
reloadProc = multiprocessing.Process(target=reloadFoo)
reloadProc.start()
...
while True:
foo.printMe()
time.sleep(20)
但看起来如果我将 foo.py 的 printMe 更改为打印“A Pirate's Life for Me”,它会重新加载模块,但不会“影响”父进程(以及未来的子进程):循环仍然打印“哟嗬嗬嗬”
我尝试将管道的一端发送到 reloadFoo,但我仍然不得不在主的 while 循环中调用 reloadFoo()(我猜这违背了它开始有一个子进程的目的)。
实际问题:有没有办法让子进程重新加载模块,并且它也会在父进程(以及未来的子进程)中重新加载?
【问题讨论】:
-
您真正需要的是文件系统事件通知。您会在 pypi.python.org/pypi/watchdog 找到一个提供该服务的图书馆。在该页面上还有一个替代列表。
-
没有简单的方法让子进程更改父进程命名空间的一部分。但是为什么在这里使用一个过程呢?您可以轻松地改用线程,因为您正在做的工作不是非常占用 CPU 资源。虽然,我猜你写它的方式,
reloadFoo函数会在轮询文件系统以查看文件是否已更改。我建议在无限循环中添加一个简短的sleep!
标签: python multithreading python-2.7 multiprocessing python-module