27

我正在为我的初学者学生玩一个库,并且我正在使用 Python 中的多处理模块。我遇到了这个问题:importing and using a module that uses multiprocessing without making the 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()

如果我main.py在 Windows 上运行,它会尝试将 main.py 导入新进程,这意味着代码会再次执行,从而导致进程生成的无限循环。我可以像这样修复它:

import mylibrary

if __name__ == "__main__":
    mylibrary.foo()

但是,这对于初学者来说非常混乱,而且似乎没有必要。新流程正在创建中mylibrary,为什么不直接导入新流程mylibrary?有没有办法解决这个问题而不必改变main.py

顺便说一句,我正在使用 Python 2.7。

4

1 回答 1

40

Windows 没有fork,因此无法像现有进程一样创建新进程。所以子进程不得不再次运行你的代码,但是现在你需要一种方法来区分父进程和子进程,__main__就是这样。

这在此处的文档中有所介绍:http: //docs.python.org/2/library/multiprocessing.html#windows

我不知道另一种构造代码以避免分叉炸弹效应的方法。

于 2013-01-05T19:18:16.337 回答