3

有没有办法matplotlib从主函数和衍生进程中使用?

在我当前的应用程序中,我希望绘制模拟的中间结果,并通过使用multiprocessing模块生成子进程来允许模拟在后台进行,并且用户可以选择关闭或保持绘图打开。在某一点,用户可以修改继续的模拟,因此主函数绘制到目前为止的结果并等待用户响应。但是,这样做时程序会出现错误消息:

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

如果我删除子流程中的中间步骤的绘图或跳过主函数中的绘图,程序运行良好。

现在我已经通过产生另一个子进程来进行绘图和检索用户输入(使用multiprocessing.Queue()join()方法)来规避这个问题。然而,这样做似乎有点多余,因此如果有更好的方法来做到这一点,我真的很感激。

查看 stackoverflow 档案,我发现一个帖子报告了相同的错误,评论说“matplotlib 不适用于多处理”。但没有建议解决方案/解决方法。

以下代码重现了该问题:

#! /usr/bin/env python


import matplotlib, multiprocessing

matplotlib.use('TkAgg')
import matplotlib.pyplot as plt

def plot(): 
   fig = matplotlib.pyplot.figure()
   fig.show()    

plot()
p = multiprocessing.Process(target=plot, args=())
p.start() 
raw_input()

作为旁注,我发现在包含代码的同时简单地使用import matplotlib代码阻塞运行良好,这有点奇怪,因为我的印象是在这种情况下但不应该可以访问。fig = matplotlib.pyplot.figure()import matplotlib.pyplot as pltpltmatplotlib.pyplot

4

1 回答 1

0

产生它类似于那里:How to start 2x Matplotlib interactiv windows, viewer of another main window? . 确保使用 mp.set_start_method('spawn') 生成它,并将 matplotlib 包含在 spanned 函数中。类似于下面的代码(未经测试)

import matplotlib, multiprocessing

matplotlib.use('TkAgg')
import matplotlib.pyplot as plt

def plot(): 
   import matplotlib
   fig = matplotlib.pyplot.figure()
   fig.show()    

plot()
multiprocessing.set_start_method('spawn') 
p = multiprocessing.Process(target=plot, args=())
p.start() 
raw_input()
于 2018-03-04T19:22:02.763 回答