繁体   English   中英

多处理启动了太多的Python VM实例

[英]Multiprocessing launching too many instances of Python VM

我正在编写一些多处理代码(Python 2.6.4,WinXP),它生成运行后台任务的进程。 在玩一些简单的例子时,我遇到了一个问题,我的代码只是不断产生新的进程,即使我只告诉它产生一个固定的数字。

程序本身运行正常,但如果我查看Windows TaskManager,我会看到新的'python.exe'进程出现。 随着程序的运行,它们会越来越多地产生(最终使我的机器挨饿)。


例如,
我希望下面的代码启动2个python.exe进程。 第一个是程序本身,第二个是它产生的子进程。 知道我做错了什么吗?

import time
import multiprocessing


class Agent(multiprocessing.Process):
    def __init__(self, i):
        multiprocessing.Process.__init__(self)
        self.i = i

    def run(self):
        while True:
            print 'hello from %i' % self.i
            time.sleep(1)


agent = Agent(1)
agent.start()

看起来您没有仔细遵循文档中的指导原则,特别是本节中谈到“安全导入主模块”的部分。

你需要使用if __name__ == '__main__':块保护你的启动代码,或者你会得到你得到的东西,我相信。

我相信它归结为多处理模块不能像在Linux上那样使用os.fork(),其中已经运行的进程基本上被克隆在内存中。 在Windows(没有这样的fork())上,它必须运行一个新的Python解释器并告诉它导入你的主模块,然后在完成后执行启动/运行方法。 如果您的代码位于“模块级别”,不受名称检查的保护,那么在导入过程中它会重新启动整个序列,无限制地

当我使用python2.6在Linux中运行它时,我看到最多4个python2.6进程,我不能保证它们都来自这个进程。 他们绝对不会填满机器。

需要新的python版本? Linux / Windows的区别?

我没有看到任何错误。 适用于Ubuntu 9.10(Python 2.6.4)。

你确定你没有cron或什么东西开始你的脚本的多个副本? 或者,生成的脚本没有调用任何可以启动新实例的内容,例如,如果您的代码直接在导入时运行,则作为导入的副作用?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM