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