Python 在Mac OSX上使用多处理时发生空闲崩溃

Python 在Mac OSX上使用多处理时发生空闲崩溃,python,macos,crash,multiprocessing,python-idle,Python,Macos,Crash,Multiprocessing,Python Idle,如果我在Python2.7.8中以空闲状态运行此简单代码,它将弹出一个窗口,显示“程序仍在运行!是否要终止它?” 即使我杀了或不杀(它会问两次),也不会发生什么。我以前使用Windows,最近才开始使用MacOSX(10.9.4),我不知道我是否遗漏了一些东西 如果我在终端的Python Shell中直接运行相同的代码,它将运行良好。在iPython笔记本中也是如此。它不会空闲,会弹出消息框 有什么想法吗?我想继续使用空闲 这是日志: INFO:root:10221: Started proce

如果我在Python2.7.8中以空闲状态运行此简单代码,它将弹出一个窗口,显示“程序仍在运行!是否要终止它?”

即使我杀了或不杀(它会问两次),也不会发生什么。我以前使用Windows,最近才开始使用MacOSX(10.9.4),我不知道我是否遗漏了一些东西

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

有什么想法吗?我想继续使用空闲

这是日志:

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

具体而言,在说明中:

此软件包中的功能要求
\uuuuu main\uuuu
模块 孩子们要求的。这在编程指南中有介绍 然而,这里值得指出。这意味着一些例子, 例如
多处理.Pool
示例在 交互式口译员。”

这里有一个类似的问题

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

#!/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:~$ 

您自己也可以尝试使用流程版本。

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


请参阅此处了解更多信息:

它是否产生任何输出?(例如,打印语句是否运行?)根本没有输出…无论我是否选择终止。控制台中的光标一直闪烁,但什么也没有发生。当我在Win10上使用2.7.13的空闲编辑器运行此命令时,它会立即打印
[0、1、4、9、16、25、36、49、64、81]
。我不知道是操作系统或版本差异导致了不同的结果,但我建议在以后的2.x或3.x版本中使用IDLE。我不认为是我的情况,同样的代码在终端的交互解释器中工作……如果它在交互解释器中工作的话(假设您将其作为文件
python mymodule.py
运行),但它在IDLE中不起作用,这表明问题出在IDLE上。可能值得使用Process而不是Pool来尝试它,看看您是否可以缩小IDLE中发生问题的确切范围-听起来好像有一个调用意外/无限期地阻塞。是的-它只是空闲的,我已经尝试在我的第一个问题中指出了这一点!我确实得到了答案使用process时也会出现同样的错误,因此它与多处理有关:(因此,问题一定与空闲模块的运行方式有关,对吗?您是否可以添加一些日志记录来精确缩小它阻塞的时间/位置?例如,在调用process().start()时?
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:~$