matplotlib(Tkinker后端)在multiprocessing.process中崩溃 - 如何调用XInitThreads

时间:2017-09-21 01:47:30

标签: python matplotlib multiprocessing

这个问题涉及到许多其他帖子,这些帖子在进程中启动X-windows时出现相同的错误消息 - 似乎没有一个解决方案可行 - 但首先是问题(因为我发现它使用ipython 2.6) :

我有许多长进程,在单个python会话中使用单独的进程以并行方式运行它们是有意义的。这些过程使用matplotlib.pyplot绘制图表。但是,当调用pyplot.show()或pyplot.figure()时,进程会崩溃整个python会话,并出现以下错误:

[xcb] Unknown sequence number while processing queue
[xcb] Most likely this ia a multi-threaded client and XInitThreads has not been called
[xcb] Aborting, sorry about that.
python2.7: xcb_io.c:259: poll_for_event: Assertion '!xcb_xlib_threads_sequence_lost' failed.
Aborted 

我能够从ipython命令行以更简单的形式重现此错误:

from matplotlib import pyplot
import multiprocessing as mp
def plot():
    pyplot.plot([1,2,3,4])
    pyplot.show() #this is the line it crashes on

# the next two lines are only needed if not iython --pyplot or you have not called pyplot.ion()
pyplot.plot([1,2,3,4]) 
pyplot.show() #close plot

p=mp.process.Process(target=plot)
p.start() #crash!!!!!

matplotlib.get_backend()的检查显示我正在运行TKAgg / Tkinker其他具有相同错误的人也使用Tkinker来制作精彩的gui。值得注意的是,我可以在不同的xterms中从单独的plot个会话中运行尽可能多的ipython例程,没有任何问题。 (给定Process命令应该创建它自己的命名空间似乎是一样的。)

所以我的问题是,在(在python中)我在哪里找到XIitThreads?它是如何/何时运行的?和手指交叉它解决了我的问题(这里有一些类似的问题)。我确实找到了这篇文章:Threading: PyQt crashes with "unknown request in queue while dequeuing"但这是针对PyQt4后端的(我没有,也无法安装。)

编辑 - 一个警告 - 如果用pyplot.show替换pyplot.show()(block = False),那么你将留下一个不会消失的窗口 - 可能是pyplot.save()的一个优点。

所有尝试在Tkinter或matplotlib中查找xcb_io的尝试都失败了 - 有谁知道这些是什么?

1 个答案:

答案 0 :(得分:0)

如果将.show()替换为pyplot.save('foo.png'),可能会更高兴,避免尝试弹出新窗口。然后使用Web浏览器显示* .png。