我遇到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
可能会导致问题,所以如果有人能够解释原因和/或帮助我解决问题,那将非常好。
答案 0 :(得分:1)
我刚才有一个非常类似的问题,我有一个并行产生图的类。我第一次创建该类的新实例并运行绘图功能时,一切都很完美。但是如果我创建一个新的实例和情节,一切都会冻结。
我通过编写一个bash脚本来修复它,然后使用单个类实例化+绘图调用的代码运行python脚本。换句话说,在一个绘图调用和下一个绘图调用之间关闭python会使工作环境变得干净,计算机不会再冻结。这不是最佳解决方案,但它起作用:))
答案 1 :(得分:0)
由于我不能发表评论,小答案就是答案。如果您在Linux计算机上或通过ssh访问,则可以通过切换到终端并终止脚本的所有进程来解冻计算机。这将再次启用X上的输入。如果你没有任何其他python进程,最简单的方法是
ps as | grep python
kill # add PID numbers of processes here
或者如果你想小心
{{1}}