2

此代码启动了无数个进程,随后使我的 PC 崩溃。

import multiprocessing

def f(process_name):
    print process_name, 'says hi'

p1 = multiprocessing.Process(None,f,'1',('1st',))
p1.start()

在控制台中,我一遍又一遍地看到“1st say hi”,在任务管理器中,我看到大量的解释器开始运行——我从 PyDev eclipse 和命令行中运行它——结果相同。

我得到的另一个结果是运行了一个 python 解释器(虽然死亡并很快生成另一个解释器),所以我无法在任务管理器中杀死它(句柄无效)。不过,它占用了 100% 的处理器。

我习惯了 java 线程 API,模块 multiprocessing 声称具有与线程模块类似的接口,它是 java 的副本。

为什么进程没有死亡?我缺少什么来简单地让这个产生一个线程,打印这个东西然后消失?

Thx,你们统治!

4

2 回答 2

8

您需要将初始化代码包装在一个if __name__ == "__main__":块中。

__main__在 fork 启动新的解释器后,Python 会再次执行您的模块。任何不受此构造保护的东西都将再次执行。这会产生您看到的效果。

于 2013-02-13T23:25:51.613 回答
0

我不相信进程会死,直到你用命令命令它们这样做myProcess.exit.set()。我会编辑您的代码,使其看起来像这样:

import multiprocessing

def f(process_name):
    print process_name, 'says hi'

p1 = multiprocessing.Process(None,f,'1',('1st',))
p1.start()
p1.exit.set()

不过,我不会在较大的程序中这样做,因为它可能会导致问题。有关详细信息,请参见此处。我还建议访问有关此的文档

于 2013-02-13T23:33:46.673 回答