2

正如我发现的那样,在多处理方面,Windows 有点像猪,我对此有疑问。

pydoc 声明您应该在使用 multiprocessing 时保护 Windows 应用程序的入口点

这是否仅意味着创建新进程的代码?

例如

脚本 1

import multiprocessing

def somemethod():
    while True:
        print 'do stuff'

# this will need protecting
p = multiprocessing.Process(target=somemethod).start()

# this wont
if __name__ == '__main__':
    p = multiprocessing.Process(target=somemethod).start()

在此脚本中,您需要将其包装在 if main中,因为生成进程的行。 但如果你有呢?

脚本 2

文件1.py

import file2
if __name__ == '__main__':
    p = Aclass().start()

文件2.py

import multiprocessing
ITEM = 0
def method1():
    print 'method1'

method1()

class Aclass(multiprocessing.Process):
    def __init__(self):
        print 'Aclass'
        super(Aclass, self).__init__()

    def run(self):
        print 'stuff'

在这种情况下需要保护什么? 如果文件 2 中有 if __main__ 会发生什么,如果正在创建进程,其中的代码会被执行吗?

注意:我知道代码不会编译。这只是一个例子。

4

1 回答 1

5

pydoc 声明您应该在使用多处理时保护 Windows 应用程序的入口点。

我的解释不同:文档说明

新的 Python 解释器可以安全地导入主模块,而不会导致意外的副作用(例如启动新进程)。

因此,导入您的模块 ( import mymodule) 不应创建新进程。也就是说,您可以通过使用

if __name__ == '__main__':
    ...

因为 ... 中的代码只会在您的程序作为主程序运行时运行,也就是说,当您这样做时

python mymodule.py

或者当您将其作为可执行文件运行时,而不是当您运行import文件时。

因此,要回答您关于 的问题file2:不,您不需要保护,因为在import file2.

另外,如果你放一个if __name__ == '__main__'in file2.py,它不会运行,因为它file2是导入的,而不是作为主程序执行的。

编辑: 是一个示例,说明当您不保护创建进程的代码时会发生什么:它可能只是循环并创建大量进程。

于 2012-11-23T17:55:06.450 回答