【问题标题】:Python, multiprocessing module, Process class, start method fail? Starts up an infinity of interpreters :|Python,多处理模块,进程类,启动方法失败?启动无限的解释器:|
【发布时间】:2013-02-13 23:22:09
【问题描述】:

这段代码启动了无数个进程,随后导致我的电脑崩溃。

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声称有一个类似于threading模块的接口,是java的一个副本。

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

谢谢,你们统治!

【问题讨论】:

  • 为什么标题说“线程模块”,为什么是“多线程”标签?您是否在未向我们展示过的地方使用threading
  • 这只是我的失败-谢谢指出。我马上修改

标签: python multithreading multiprocessing


【解决方案1】:

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

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

【讨论】:

  • 为了好奇,你不能也添加一行for x in xrange(1):,然后现有的代码会在它下面吗?
  • @xxmbabanexx:新的解释器将执行相同的for x in xrange(1),所以这无济于事。如果您尝试将 x 作为一个由所有进程共享的全局变量,您可以在某些情况下使类似的东西工作,但它在 Windows 中永远无法工作,并且在某些情况下它在 POSIX 中不起作用,可能还有更多情况在 3.4 中不起作用,依此类推,所以……我不会解释如何做到这一点,只是不要这样做。
  • 谢谢!似乎解释代码与我认为的 java 编译代码不同。
【解决方案2】:

我不相信进程会死,除非你用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()

我不会在较大的程序中这样做,因为它可能会导致问题。有关更多信息,请参阅here。我还建议在此访问documentation

【讨论】:

  • 实际上进程确实会自行退出
猜你喜欢
  • 2015-09-26
  • 2015-04-16
  • 2010-12-17
  • 1970-01-01
  • 2017-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多