Python多处理:在子级和父级中重新加载模块
我觉得我应该用以下语句作为这个问题的开头:我知道用python重新加载模块是不受欢迎的。更多的是我在修补Python,做一些事情来证明我能做到 假设我在主文件中有这段代码:Python多处理:在子级和父级中重新加载模块,python,multithreading,python-2.7,multiprocessing,python-module,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 = ti
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()
,它将永远重新加载自上次重新加载后修改过的模块。但是我如何使它作为某种背景函数工作呢
我研究了多重处理,所以我主要有以下内容:
import foo
def reloadFoo():
....
reloadProc = multiprocessing.Process(target=reloadFoo)
reloadProc.start()
...
while True:
foo.printMe()
time.sleep(20)
但是,如果我将foo.py的printMe改为打印“我的海盗生活”,它会重新加载模块,但不会“涟漪”到父进程(以及未来的子进程):主循环仍然打印“Yo ho Yo ho”
我尝试将管道的一端发送到reloadFoo,但我仍然必须在main的while循环中调用reloadFoo()(我想这会破坏它以子进程开始的目的)
实际问题:是否有一种方法可以让子进程重新加载模块,并且在父进程(以及未来的子进程)中也会重新加载模块?子进程无法以这种方式直接影响其父进程。将Python添加到混合中,实际上不可能以您想要的方式完成 你说你知道重新加载模块是不受欢迎的,你只是在“修修补补”,但你接着说了一个实际的问题:有没有一种方法可以让子进程重新加载模块,并且它也会在父进程(以及未来的子进程)中重新加载 既然你已经问了这个问题,我将给出你不想要的答案,因为堆栈溢出不仅仅是关于原始提问者:-) 重新加载模块不会因为美观而不受欢迎;不赞成重新加载模块,因为在任何实际系统中,重新加载模块不太可能满足您的需求,即使您不尝试从不同的过程中执行此操作 例如,让我们创建一个名为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
它有一个单独的类定义,这个类可以做的一件事就是允许它的实例查看它们是否与它的其他实例相等。(这本身就不太符合音律,因为它不使用duck类型,但它仍然是一种非常简单的方式来说明在任何规模的系统中都会出现的真实问题。)因此,让我们使用这个模块:
>>> import reloadme
>>> x = reloadme.MyClass()
>>> y = reloadme.MyClass()
>>> reload(reloadme)
>>> z = reloadme.MyClass()
>>> x == y
True
>>> x == z
False
即使您已经成功地重新加载了该模块,但仍然有旧模块的位和位挂在系统上。清理它们真的很痛苦,也很耗时,不清理它们会给你带来调试方面的麻烦,让你质疑自己的理智
尽管如此,这样做可能有很好的理由,例如,系统永远无法倒下。但这不是一件容易的事情,而且大多数时候,它的效率也不是很高。子进程不能以这种方式很容易地直接影响其父进程。将Python添加到混合中,实际上不可能以您想要的方式完成 你说你知道重新加载模块是不受欢迎的,你只是在“修修补补”,但你接着说了一个实际的问题:有没有一种方法可以让子进程重新加载模块,并且它也会在父进程(以及未来的子进程)中重新加载 既然你已经问了这个问题,我将给出你不想要的答案,因为堆栈溢出不仅仅是关于原始提问者:-) 重新加载模块不会因为美观而不受欢迎;不赞成重新加载模块,因为在任何实际系统中,重新加载模块不太可能满足您的需求,即使您不尝试从不同的过程中执行此操作 例如,让我们创建一个名为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
它有一个单独的类定义,这个类可以做的一件事就是允许它的实例查看它们是否与它的其他实例相等。(这本身就不太符合音律,因为它不使用duck类型,但它仍然是一种非常简单的方式来说明在任何规模的系统中都会出现的真实问题。)因此,让我们使用这个模块:
>>> import reloadme
>>> x = reloadme.MyClass()
>>> y = reloadme.MyClass()
>>> reload(reloadme)
>>> z = reloadme.MyClass()
>>> x == y
True
>>> x == z
False
即使您已经成功地重新加载了该模块,但仍然有旧模块的位和位挂在系统上。清理它们真的很痛苦,也很耗时,不清理它们会给你带来调试方面的麻烦,让你质疑自己的理智
尽管如此,这样做可能有很好的理由,例如,系统永远无法倒下。但这不是一件容易的事情,而且大多数情况下,这不是很有效率。您实际需要的是文件系统事件通知。您将在中找到一个提供该功能的图书馆。在该页面上还有一个备选方案列表,让子进程更改父进程名称空间的一部分并不容易。但为什么要在这里使用流程?您可以很容易地使用线程,因为您所做的工作并不是非常需要CPU。不过,我想按照您的编写方式,
reloadFoo
函数将对文件系统进行大量轮询,以查看文件是否已更改。我建议在无限循环中添加一个短睡眠!您实际需要的是文件系统事件通知。您将在中找到一个提供该功能的图书馆。在该页面上还有一个备选方案列表,让子进程更改父进程名称空间的一部分并不容易。但为什么要在这里使用流程?您可以很容易地使用线程,因为您所做的工作并不是非常需要CPU。不过,我想按照您的编写方式,reloadFoo
函数将对文件系统进行大量轮询,以查看文件是否已更改。我