多进程启动过多Python虚拟机实例

18 投票
3 回答
6179 浏览
提问于 2025-04-15 17:08

我正在写一些多进程的代码(Python 2.6.4,WinXP),这个代码会启动一些进程来运行后台任务。在玩一些简单的例子时,我遇到了一个问题:我的代码不断地生成新的进程,尽管我只告诉它要生成固定数量的进程。

程序本身运行得很好,但如果我查看Windows任务管理器,我会发现不断出现新的'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()

3 个回答

0

我觉得这没什么问题。在Ubuntu 9.10上(Python 2.6.4)运行得很好。

你确定没有什么像cron这样的东西在启动你脚本的多个副本吗?或者说你启动的脚本没有调用什么会启动新实例的东西,比如如果你的代码在导入时直接运行,可能会因为导入的副作用而启动新的实例?

0

当我在Linux上用python2.6运行这个时,我最多能看到4个python2.6的进程,但我不能保证这些进程都是由这个程序产生的。它们肯定没有占满机器的资源。

需要更新python版本吗?Linux和Windows有什么不同?

24

看起来你没有仔细按照文档里的指导来做,特别是这一部分,里面提到“安全导入主模块”的内容。

你需要用一个if __name__ == '__main__':的代码块来保护你的启动代码,否则你就会遇到现在的问题,我想是这样的。

我认为这主要是因为在Windows上,multiprocessing模块不能像在Linux上那样使用os.fork()。在Linux上,已经运行的进程基本上是被克隆到内存中。而在Windows上(没有这样的fork()),它必须启动一个新的Python解释器,并告诉它去导入你的主模块,然后在完成后执行启动或运行的方法。如果你的代码在“模块级别”,没有经过名称检查的保护,那么在导入时就会重新开始整个过程,循环无止境。

撰写回答