我正在为初学者学习图书馆,我正在使用Python中的多处理模块。我遇到了这个问题:importing and using a module that uses multiprocessing without causing infinite loop on Windows
例如,假设我有一个模块mylibrary.py
:
# mylibrary.py
from multiprocessing import Process
class MyProcess(Process):
def run(self):
print "Hello from the new process"
def foo():
p = MyProcess()
p.start()
调用此库的主程序:
# main.py
import mylibrary
mylibrary.foo()
如果我在Windows上运行main.py
,它会尝试将main.py导入新进程,这意味着代码会再次执行,从而导致无限循环的进程生成。我可以像这样修理它:
import mylibrary
if __name__ == "__main__":
mylibrary.foo()
但是,这对初学者来说非常困惑,而且似乎没有必要。新流程正在mylibrary
中创建,那么为什么新流程不会导入mylibrary
?有没有办法解决这个问题,而无需更改main.py
?
顺便说一下,我正在使用Python 2.7。
答案 0 :(得分:32)
Windows没有fork
,因此无法像现有流程那样制作新流程。因此,子进程必须再次运行您的代码,但现在您需要一种方法来区分父进程和子进程,__main__
就是它。
此处的文档中介绍了这一点:http://docs.python.org/2/library/multiprocessing.html#windows
我不知道另一种构造代码的方法来避免fork炸弹效应。