Matplotlib与多处理冻结计算机

时间:2015-07-10 12:44:42

标签: python python-2.7 matplotlib multiprocessing

我遇到matplotlib和多处理问题。 我启动了第一个过程,我在其中显示图像并选择一个区域,然后关闭图形。然后我启动另一个进程,在那里我调用一个定期更新的图形函数。在这一点上,eveything工作正常。 然后,当我尝试使用SAME图形函数启动另一个进程时,它会冻结我的整个计算机,但后台进程仍然工作... 我只有其中一个错误(它并不总是一样):

错误1:

  

XIO:X服务器上的致命IO错误25(设备不适当的ioctl)   “:0.0”         在4438个请求(4438已知已处理)之后剩余30个事件。 XIO:致命IO错误11(资源暂时不可用)   在X服务器上“:0.0”         在4443个请求(4443已知已处理)之后剩余31个事件。 [xcb]处理队列时的未知序列号[xcb]   很可能这是一个多线程客户端而XInitThreads没有   被称为[xcb]中止,抱歉。蟒蛇:   ../../src/xcb_io.c:274:poll_for_event:断言   `!xcb_xlib_threads_sequence_lost'失败。

错误2:

  

X请求失败的错误:BadIDChoice(选择了无效的资源ID)   对于此连接)失败请求的主要操作码:53   (X_CreatePixmap)失败请求中的资源ID:0x5600299 Serial   失败请求数:4793输出中的当前序列号   流:4795 XIO:致命IO错误25(设备不适当的ioctl)   在X服务器上“:0.0”         在4788个请求(4788已知已处理)之后剩余31个事件。 XIO:致命的IO错误25(设备的不适当的ioctl)打开   X服务器“:0.0”         在4793个请求(已知已处理4793个)之后,剩余32个事件。

奇怪的是,我可以完全启动几个进程调用图形函数而没有任何问题,它是与第一个图形的耦合,使其不稳定。

在尝试调试时,我发现一个简单的fig=plt.figure()足以让所有内容崩溃:实际上,对plt的任何调用......

我在这里和那里读到你可以强制matplotlib使用agg后端,它有助于多进程,但是有些小部件无法使用它,所以我想避免这种情况。

我真的不明白为什么在不同的进程中使用matplotlib可能会导致问题,所以如果有人能够解释原因和/或帮助我解决问题,那将非常好。

2 个答案:

答案 0 :(得分:1)

我刚才有一个非常类似的问题,我有一个并行产生图的类。我第一次创建该类的新实例并运行绘图功能时,一切都很完美。但是如果我创建一个新的实例和情节,一切都会冻结。

我通过编写一个bash脚本来修复它,然后使用单个类实例化+绘图调用的代码运行python脚本。换句话说,在一个绘图调用和下一个绘图调用之间关闭python会使工作环境变得干净,计算机不会再冻结。这不是最佳解决方案,但它起作用:))

答案 1 :(得分:0)

由于我不能发表评论,小答案就是答案。如果您在Linux计算机上或通过ssh访问,则可以通过切换到终端并终止脚本的所有进程来解冻计算机。这将再次启用X上的输入。如果你没有任何其他python进程,最简单的方法是

ps as | grep python
kill # add PID numbers of processes here

或者如果你想小心

{{1}}
相关问题