我发现 Windows 在多处理方面有点笨拙,我对此有疑问。
pydoc 指出你应该使用多处理时保护 Windows 应用程序的入口点.
这是否意味着仅创建新进程的代码?
例如
Script 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因为线在产卵的过程中。但如果你有呢?
Script 2
file1.py
import file2
if __name__ == '__main__':
p = Aclass().start()
file2.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__会发生什么,如果正在创建进程,其中的代码会被执行吗?
注意:我知道代码无法编译。这只是一个例子。
pydoc 指出,在使用多处理时,您应该保护 Windows 应用程序的入口点。
我的解释不同:文档指出
主模块可以由新的 Python 解释器安全地导入,而不会导致意外的副作用(例如启动新进程)。
所以导入你的模块(import mymodule
)不应创建新进程。也就是说,您可以通过使用以下方法保护进程创建代码来避免启动进程:
if __name__ == '__main__':
...
因为...中的代码仅当您的程序作为主程序运行时才会运行,即当您执行
python mymodule.py
或者当您将其作为可执行文件运行时,但不是当您import
文件。
所以,回答你关于file2
:不,您不需要保护,因为在此期间没有启动任何进程import file2
.
另外,如果你放一个if __name__ == '__main__'
in file2.py
,它不会运行,因为file2
被导入,不作为主程序执行。
edit: here这是当您不保护进程创建代码时可能发生的情况的一个示例:它可能只是循环并创建大量进程。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)