【问题标题】:IDLE crash when using multiprocessing on Mac OSX在 Mac OSX 上使用多处理时 IDLE 崩溃
【发布时间】:2014-07-23 08:57:05
【问题描述】:

如果我在 Python 2.7.8 的 IDLE 中运行这个简单的代码,它会弹出一个窗口说“程序仍在运行!你想杀死它吗?”。

from multiprocessing import Pool

def foo(x):
    return x**2

if __name__ == '__main__':
    pool = Pool(2)
    pows = pool.map(foo, range(10))
    print pows

即使我杀与不杀(它会问两次),也不会发生任何事情。我以前使用 Windows,最近才开始使用 Mac OSX (10.9.4),不知道是不是漏掉了什么。

如果我直接在终端的 Python Shell 中运行相同的代码,它将运行良好。在 iPython 笔记本中也是如此。它只是不会在 IDLE 上弹出那个消息框。

有什么想法吗?我想继续使用 IDLE...

这是日志:

INFO:root:10221: Started process
INFO:root:10221: Defined foo
INFO:root:10221: __name__ == '__main__'
INFO:root:10221: pool created

【问题讨论】:

  • 它会产生任何输出吗? (例如打印语句是否运行?)
  • 根本没有输出......不管我是否选择杀戮。光标在控制台中不断闪烁,没有任何反应。似乎和这里的问题一样stackoverflow.com/questions/20760876/…
  • 当我在 Win10 上使用 2.7.13 的 IDLE 编辑器运行它时,它会立即打印 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]。我不知道操作系统或版本的差异是否会导致不同的结果,但我建议在以后的 2.x 或 3.x 版本中使用 IDLE。

标签: python macos crash multiprocessing python-idle


【解决方案1】:

参考这个: https://docs.python.org/2/library/multiprocessing.html#introduction

具体在注释中:

此包中的功能要求 __main__ 模块是 孩子们可以导入。这在编程指南中有介绍 但是值得在这里指出。这意味着一些例子, 例如multiprocessing.Pool 的例子在 交互式解释器。”

这是一个类似的问题Child processes created with python multiprocessing module won't print

将活动记录到文件的示例:

#!/usr/bin/env python

import logging
from multiprocessing import Pool
import os

logging.basicConfig(filename='example.log',level=logging.DEBUG)

def log_msg(msg):
    logging.info("{}: {}".format(os.getpid(), msg))

log_msg("Started process")

def foo(x):
    log_msg("running foo")
    return x**2

log_msg("Defined foo")

if __name__ == '__main__':
    log_msg("__name__ == '__main__'")

    pool = Pool(2)
    log_msg("pool created")
    pows = pool.map(foo, range(10))
    log_msg("map completed")
    print pows
    log_msg("output printed")

log_msg("Finished running")

我的示例输出:

tom@fannybawz:~$ ./multiproc.py
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
tom@fannybawz:~$ cat example.log 
INFO:root:22238: Started process
INFO:root:22238: Defined foo
INFO:root:22238: __name__ == '__main__'
INFO:root:22238: pool created
INFO:root:22240: {}: running foo
INFO:root:22239: {}: running foo
INFO:root:22240: {}: running foo
INFO:root:22239: {}: running foo
INFO:root:22240: {}: running foo
INFO:root:22239: {}: running foo
INFO:root:22240: {}: running foo
INFO:root:22239: {}: running foo
INFO:root:22240: {}: running foo
INFO:root:22240: {}: running foo
INFO:root:22238: map completed
INFO:root:22238: output printed
INFO:root:22238: Finished running
tom@fannybawz:~$ 

使用 Process 版本自己尝试相同的操作。

【讨论】:

  • 我不认为是我的情况,完全相同的代码在终端的交互式解释器中工作......
  • 如果它在交互式解释器中工作(并且假设你将它作为文件运行python mymodule.py),但它在 IDLE 中不起作用,则表明问题出在 IDLE 上。
  • 可能值得尝试使用 Process 而不是 Pool 来查看是否可以缩小 IDLE 中问题发生的确切位置 - 听起来像是一个调用意外/无限期阻塞。
  • 是的 - 它只是空闲的,我试图在我的第一个问题中指出!我确实在使用进程时遇到了同样的错误,所以它以某种方式与多处理有关:(
  • 所以问题一定和IDLE如何运行你的模块有关吧?您可以添加一些日志记录以准确缩小阻塞的时间/位置吗?例如。调用 Process().start() 时?
【解决方案2】:

这是先前版本的 Pycharm 的一个已知问题。如果您现在升级到最新版本,您可以在 IDE 的控制台中安全地使用多处理,而无需再在此问题中运行。

更多信息请看这里:https://youtrack.jetbrains.com/issue/PY-14969

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 2012-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多