python - 为什么我的进程生成四次,而不是两次?

标签 python python-2.7 process multiprocessing

我有三个脚本,Win7x64 上的 Python 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!

或者在此处查看输出:/image/8anvL.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 才能将其从父进程发送到子进程,并且取消 pickle 子进程中的函数需要导入以下模块:该函数属于 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 - 为什么我的进程生成四次,而不是两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29153044/

相关文章:

python - 在 Django 模板中计算外键模型的正确方法

python - 学习 Python 拆分和合并?

python - PyMongo:类型错误:规范必须是 dict 的实例

python - 艰难地学习 Python - 练习 39

java - 如果进程以退出代码 0 结束,我应该调用 Process.destroy() 吗?

python - 带可选参数的 Django HTTPResponseRedirect & Reverse

python - 寻找 3 个函数的共同输出

python - 在另一个文件上使用一个文件 - Python - Windows

java - 如何使用 java.lang.process 运行多个 Linux 命令?

c# - 编码 UTF8 C# 过程