正如我所发现的那样,当涉及到多处理时,窗口有点像猪,我对此有疑问。
在使用多处理时 ,pydoc应该保护windows应用程序的入口点 。
这是否意味着只有创build新过程的代码?
例如
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()
在这个脚本中,你需要把这个包装在main中,因为这个线程正在产生这个进程。 但是如果你有呢?
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__,会发生什么情况,如果正在创build一个进程,那么这个内部的代码会被执行吗?
注意:我知道代码将不会编译。 这只是一个例子。
在使用多处理时,pydoc应该保护windows应用程序的入口点。
我的解释不同:文件说明
主模块可以通过一个新的Python解释器安全地导入,而不会造成意想不到的副作用(例如启动一个新的进程)。
所以导入你的模块( import mymodule
)不应该创建新的进程。 也就是说,你可以通过用一个保护你的进程创建代码来避免启动进程
if __name__ == '__main__': ...
因为只有当程序作为主程序运行时,才会运行…中的代码
python mymodule.py
或者当您将其作为可执行文件运行时,而不是在import
文件时。
所以,要回答你关于file2
的问题:不,你不需要保护,因为在import file2
期间没有启动进程。
另外,如果你if __name__ == '__main__'
放置了一个if __name__ == '__main__'
,它将不会运行,因为file2
被导入,不会作为主程序执行。
编辑: 这里是一个当你不保护你的进程创建代码时会发生什么的例子:它可能只是循环并创建了大量的进程。