17

我正在编写一些生成进程以运行后台任务的多处理代码(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()
4

3 回答 3

23

看起来您没有仔细遵循文档中的指南,特别是本节讨论“安全导入主模块”。

我相信你需要用一个块来保护你的启动代码,if __name__ == '__main__':否则你会得到你所得到的。

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

于 2009-12-17T21:00:01.630 回答
0

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

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

于 2009-12-17T18:43:10.913 回答
0

我看不出有什么问题。在 Ubuntu 9.10 (Python 2.6.4) 上运行良好。

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

于 2009-12-17T18:50:24.060 回答