【发布时间】:2014-07-20 18:26:33
【问题描述】:
当我使用 pytnon 多处理池并导入 numpy 和 PySide 时,我的机器上发生了这种非常奇怪的挂起。这是迄今为止我见过的最纠结的bug:)如下代码:
import numpy as np
import PySide
def hang():
import multiprocessing
pool = multiprocessing.Pool(processes = 1)
pool.map(f, [None])
def f(ignore):
print('before dot..')
np.dot(np.zeros((128, 1)), np.zeros((1, 32)))
print('after dot.')
if __name__ == "__main__":
hang()
print('success!')
仅在“点之前”挂起打印。但它应该打印出来
before dot..
after dot.
success!
我不是 gdb 专家,但看起来 gdb 显示进程在“np.dot”行上退出(或崩溃):
[Inferior 1 (process 2884) exited normally]
我可以做几个神奇的修改来防止挂起:
- 如果您减小进入“点”的数组形状(例如,从 128 到 127)
- (!)如果您将进入“点”的数组的形状从 128 增加到 256
- 如果您不使用多处理并只运行函数“f”
- (!!!) 如果您注释掉代码中未使用的 PySide 导入
感谢任何帮助!
包版本:
numpy=1.8.1 或 1.7.1 PySide=1.2.1 或 1.2.2
Python 版本:
Python 2.7.5(默认,2013 年 9 月 12 日,21:33:34) [GCC 4.2.1 兼容 Apple LLVM 5.0 (clang-500.0.68)] 达尔文
或
Python 2.7.6(默认,2014 年 4 月 9 日,11:48:52) [GCC 4.2.1 兼容 Apple LLVM 5.1 (clang-503.0.38)] 达尔文
注意:在寻找信息时,我简化了原始代码并提出了一些问题。但是这里有一堆更新,可以为可能遇到此错误的其他人保留历史记录(例如,我从 matplotlib 开始,而不是 pyside)
更新:我将 pylab 导入范围缩小到使用 pyside 后端导入 matplotlib 并更新了要运行的代码。
更新:我正在修改帖子以仅导入 PySide 而不是:
import matplotlib
matplotlib.use('qt4agg')
matplotlib.rcParams['backend.qt4']='PySide'
import matplotlib.pyplot
更新:初步统计显示,这是一个仅限 Mac 的问题。 3 个人在 Ubuntu 上运行,2 个人在 Mac 上运行。
更新:点操作之前的 print(os.getpid()) 给了我在“顶部”中看不到的 pid,这显然意味着它崩溃并且多处理等待死进程。出于这个原因,我无法将调试器附加到它。我相应地编辑了主要问题。
【问题讨论】:
-
将 python 更新到 2.7.6 没有帮助
-
导入 import matplotlib.pyplot 而不是 pylab 没有帮助
-
如果 matplotlib 后端不是“qt4agg”,则不会出现问题。所以看起来这里甚至涉及到 qt。
-
它适用于我的:NumPy 1.8.0、Python 2.7、64 位...
-
也无法重现。使用调试器查看挂起的位置怎么样?
标签: python numpy multiprocessing pyside