为什么我的进程生成四次而不是两次?
Why does my process spawn four times, instead of two?
我有三个脚本,Python Win7x64 上的 2.7.9 (kivy)。
multiprocessing_1
def Multiprocessing_3():
print "Hohoo!"
import multiprocessing_3
multiprocessing_3.LetseGo()
print "It'se me,",__name__," !!"
if __name__ == "__main__":
import multiprocessing_2
multiprocessing_2.main()
multiprocessing_2
import multiprocessing
def main():
print "YA!"
import multiprocessing_1
Multiprocessing3 = multiprocessing.Process(target=multiprocessing_1.Multiprocessing_3,args=(''))
Multiprocessing3.start()
multiprocessing_3
def LetseGo():
print "YAHoooooooo!"
我的问题是关于执行 python multiprocessing_1.py
:
后我得到的输出
It'se me, __main__!!
YA!
It'se me, multiprocessing_1!!
It'se me, __parents_main__!!
It'se me, multiprocessing_1!!
Hohoo!
YAHoooooooo!
或在此处查看输出:http://i.imgur.com/ROtLAaZ.png
_1
以 __main__
开始,然后导入并调用 _2
,然后生成进程 _1.Multiprocessing_3
,导入并执行 _3.LetseGo()
。
不过,发生的事情是 _1
实际上运行了 四次 次,而不是我实际预期的两次。
你能告诉我为什么吗?
发生这种情况是因为您 运行 Windows 上的代码,并且 Windows 需要 re-import your __main__
module(恰好是 multiprocessing_1.py
)在子进程中执行您传递给 multiprocessing.Process
的函数。此外,您要在子进程中调用的函数 Multiprocessing_3
需要进行 pickle,以便将其从父进程发送到子进程,而在子进程中取消函数需要导入该函数所属的模块to,又是 multiprocessing_1
。所以对每个输出的解释是:
It'se me, __main__!! # multiprocessing_1 is imported when you execute it directly.
YA!
It'se me, multiprocessing_1!! # multiprocessing_2.py calls 'import multiprocessing_1'
It'se me, __parents_main__!! # after you call multiprocessing3.start(), the child process needs to re-import the `__main__` module of your script, which is multiprocessing_1.py
It'se me, multiprocessing_1!! # This import happens so that the Multiprocessing_3 function can be unpickled in the child.
Hohoo!
YAHoooooooo!
我有三个脚本,Python Win7x64 上的 2.7.9 (kivy)。
multiprocessing_1
def Multiprocessing_3():
print "Hohoo!"
import multiprocessing_3
multiprocessing_3.LetseGo()
print "It'se me,",__name__," !!"
if __name__ == "__main__":
import multiprocessing_2
multiprocessing_2.main()
multiprocessing_2
import multiprocessing
def main():
print "YA!"
import multiprocessing_1
Multiprocessing3 = multiprocessing.Process(target=multiprocessing_1.Multiprocessing_3,args=(''))
Multiprocessing3.start()
multiprocessing_3
def LetseGo():
print "YAHoooooooo!"
我的问题是关于执行 python multiprocessing_1.py
:
It'se me, __main__!!
YA!
It'se me, multiprocessing_1!!
It'se me, __parents_main__!!
It'se me, multiprocessing_1!!
Hohoo!
YAHoooooooo!
或在此处查看输出:http://i.imgur.com/ROtLAaZ.png
_1
以 __main__
开始,然后导入并调用 _2
,然后生成进程 _1.Multiprocessing_3
,导入并执行 _3.LetseGo()
。
不过,发生的事情是 _1
实际上运行了 四次 次,而不是我实际预期的两次。
你能告诉我为什么吗?
发生这种情况是因为您 运行 Windows 上的代码,并且 Windows 需要 re-import your __main__
module(恰好是 multiprocessing_1.py
)在子进程中执行您传递给 multiprocessing.Process
的函数。此外,您要在子进程中调用的函数 Multiprocessing_3
需要进行 pickle,以便将其从父进程发送到子进程,而在子进程中取消函数需要导入该函数所属的模块to,又是 multiprocessing_1
。所以对每个输出的解释是:
It'se me, __main__!! # multiprocessing_1 is imported when you execute it directly.
YA!
It'se me, multiprocessing_1!! # multiprocessing_2.py calls 'import multiprocessing_1'
It'se me, __parents_main__!! # after you call multiprocessing3.start(), the child process needs to re-import the `__main__` module of your script, which is multiprocessing_1.py
It'se me, multiprocessing_1!! # This import happens so that the Multiprocessing_3 function can be unpickled in the child.
Hohoo!
YAHoooooooo!