【问题标题】:Python Pool Silently Crashes When Defined in IDLE在 IDLE 中定义时,Python 池静默崩溃
【发布时间】:2014-07-02 00:01:34
【问题描述】:

我正在尝试将 multiprocessing 包用于 python。但是,当我尝试在 IDLE 中定义一个池时,它会静默崩溃(没有错误消息或回溯,IDLE 只是关闭)。另一方面,同样的脚本在从终端执行时运行没有问题。是什么赋予了?我在 Ubuntu 12.04 上使用 python 2.7。

import multiprocessing
from multiprocessing import Pool

def myfunc(x):
    return x*x

cpu_count = int(multiprocessing.cpu_count() - 1)
pool = Pool(processes = cpu_count) #Crashes here in IDLE
resultlist = pool.map(myfunc, range(10))
pool.close()
print(resultlist)

【问题讨论】:

  • stackoverflow.com/a/2806280/110707 可能会有所帮助。
  • 所以不是我,是multiprocessingIDLE?我想我以前从未注意到这一点,因为我倾向于在我想看到的子进程中有打印语句,并且我知道 IDLE 不会使用其全局锁定打印,所以我想我总是从终端运行带有多处理的脚本.但真的吗??? IDLE 不能处理多进程???太傻了。
  • idle 不是一个好主意...你应该切换到别的东西真的...
  • @JoranBeasley 建议?
  • 我喜欢 pycharm ...但几乎任何东西都比空闲的 imho (ninja、Eclipse+pydev 等) 好

标签: python multiprocessing python-idle


【解决方案1】:

问题您的代码:它缺少if __name__ == '__main__': 保护子句,这是多处理文档章节中每个工作示例的重要组成部分,因为它保留每个子进程从运行开始和结束代码。在空闲(或没有空闲,在控制台中)运行以下命令

import multiprocessing
from multiprocessing import Pool

def myfunc(x):
    return x*x

if __name__ == '__main__':
    cpu_count = int(multiprocessing.cpu_count() - 1)
    pool = Pool(processes = cpu_count) #Crashes here in IDLE
    resultlist = pool.map(myfunc, range(10))
    pool.close()
    print(resultlist)

几乎立即打印

[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

如果您在控制台中运行原始代码(或在控制台中启动 Idle),随着每个进程启动更多进程,您将看到无穷无尽的错误消息流。

编辑:上述行为适用于 Windows 10

我建议您忽略意见,并根据当前和真实的事实自行决定要使用哪些工具。尝试使用您使用的任何 Python 版本的最新错误修复版本。特别是对于 Idle,在经历了几年左右的停滞后,在过去 2 年中进行了许多修复。

【讨论】:

  • @TheMatt 导入缓存仅适用于进程。每个新进程重新执行模块代码。它至少在 Windows 上。我描述的行为是在 Windows 上。我刚刚重新验证了在没有 IDLE 的情况下在控制台中运行,并在我的答案中添加了一个注释,它本来应该在那里。我必须关闭窗口才能停止消息流。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-25
  • 2014-10-29
  • 1970-01-01
  • 2018-12-11
  • 1970-01-01
  • 2015-08-26
相关资源
最近更新 更多