【问题标题】:Python multiprocessing continuously spawns pythonw.exe processes without doing any actual workPython 多处理不断产生 pythonw.exe 进程而不做任何实际工作
【发布时间】:2011-03-25 05:45:33
【问题描述】:

我不明白为什么这么简单的代码

# file: mp.py
from multiprocessing import Process
import sys

def func(x):
    print 'works ', x + 2
    sys.stdout.flush()

p = Process(target= func, args= (2, ))
p.start()
p.join()
p.terminate()
print 'done'
sys.stdout.flush()

连续创建“pythonw.exe”进程并且它不打印任何东西,即使我从命令行运行它:

python mp.py

我在 32 位和 64 位的 Windows 7 上运行最新的 Python 2.6

【问题讨论】:

  • 运行时的输出是什么?

标签: python windows process multiprocessing


【解决方案1】:

你需要protect then entry point of the program by using if __name__ == '__main__':

这是一个特定于 Windows 的问题。在 Windows 上,您的模块必须导入新的 Python 解释器才能访问您的目标代码。如果你不停止这个新的解释器运行启动代码,它将产生另一个孩子,然后再产生另一个孩子,直到它的pythonw.exe 进程在眼睛所见。

其他平台使用os.fork()启动子进程,所以不存在重新导入模块的问题。

所以您的代码需要如下所示:

from multiprocessing import Process
import sys

def func(x):
    print 'works ', x + 2
    sys.stdout.flush()

if __name__ == '__main__':
    p = Process(target= func, args= (2, ))
    p.start()
    p.join()
    p.terminate()
    print 'done'
    sys.stdout.flush()

【讨论】:

  • 这个线程救了我一命,我的简单 python 脚本生成了“数以万计”的 pythonw.exe 并导致 Windows 超载并崩溃。谢谢!
【解决方案2】:

根据programming guidelines进行多处理,在windows上你需要使用if __name__ == '__main__':

【讨论】:

    【解决方案3】:

    有趣,在我的 Linux 机器上工作:

    $ python mp.py
    works  4
    done
    $
    

    多处理的东西应该在 Windows 上工作吗?许多起源于 Unix 世界的程序不能很好地处理 Windows,因为 Unix 使用fork(2) 来克隆进程非常便宜,但是(据我的理解)Windows 不能优雅地支持fork(2),如果有的话。

    【讨论】:

    • Windows 不支持 fork,因此必须启动新的 Python 解释器并重新导入模块,即您的脚本。如果您没有使用if __name__ == '__main__': 保护您的启动代码,那么它会由不好的子进程运行。
    • ...由孩子的子进程运行,由孩子的子进程运行,...
    猜你喜欢
    • 1970-01-01
    • 2017-04-23
    • 2022-06-21
    • 1970-01-01
    • 2021-01-01
    • 2021-07-17
    • 2017-08-29
    • 2021-05-01
    • 2019-11-05
    相关资源
    最近更新 更多