Python多处理:在子效应父级中重新加载模块

时间:2015-08-26 03:24:19

标签: python multithreading python-2.7 multiprocessing python-module

我觉得我应该在下面的陈述中提出这个问题:我知道在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”,它会重新加载模块,但不会“涟漪”到父进程(以及未来的子进程):主要循环仍打印“Yo ho yo ho”

我尝试将一个Pipe的一端发送到reloadFoo,但我仍然必须在main的while循环中调用reloadFoo()(这使得它开始使用子进程的目的,我猜)。 / p>

实际问题:子进程是否有办法重新加载模块,并且还会在父进程(以及未来的子进程)中重新加载?

1 个答案:

答案 0 :(得分:0)

子进程不能以这种方式直接影响其父进程。将Python添加到混合中,实际上不可能以你想要的方式做到。

你说你知道重装模块是不受欢迎的,蚂蚁你只是在修补"然后你继续说实际问题:有办法吗?一个子进程重新加载一个模块,它也会在父进程(以及未来的子进程)中重新加载?

所以,既然你已经问了这个问题,我会给出你不想要的答案,因为Stack Overflow不只是关于原始提问者: - )

由于美观,重装模块并不受欢迎;重新加载模块是不受欢迎的,因为在任何实际系统中,重新加载模块不太可能给你你想要的东西,即使你没有试图从不同的进程中做到这一点< /强>

例如,让我们创建一个名为reloadme.py的简单模块:

class MyClass(object):
    def __init__(self, value=0):
        self.value = value
    def __eq__(self, other):
        return type(self) is type(other) and self.value == other.value

它有一个类定义,这个类可以做的事情之一是允许它的实例看它们是否等于它的其他实例。 (这本身就是非平等的,因为它不使用鸭子打字,但它仍然是一种非常简单的方式来说明在任何系统中出现的现实问题大小。)所以让我们使用这个模块:

>>> import reloadme
>>> x = reloadme.MyClass()
>>> y = reloadme.MyClass()
>>> reload(reloadme)
>>> z = reloadme.MyClass()
>>> x == y
True
>>> x == z
False

即使您已经成功重新加载了模块,仍然会有一些旧的东西悬挂在系统周围。清理它们真的非常痛苦和耗时,清理它们会导致各种调试问题让你质疑自己的理智。

仍然,可能是做这件事的充分理由,例如永远不会失败的系统。但这并不是一件容易的事情,而且大多数时候,它并不是很有效率。