使用来自main和衍生过程的matplotlib

时间:2015-11-24 10:02:50

标签: python matplotlib multiprocessing xcb

有没有办法从主函数和衍生进程中使用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存档我在同一个error发现了一个帖子报告,评论说" 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 plt代码运行正常,这有点奇怪,因为我的印象是这种情况pltmatplotlib.pyplot应该无法访问。

1 个答案:

答案 0 :(得分:0)

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

<nav class="navbar navbar-expand-lg navbar-light fixed-top" style="background-color:white;">
        <div class="container">
        <a class="navbar-brand" href="#"><img style="   width: 150px;" src="image.jpg" alt="Image text"></a>
        <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarResponsive" aria-controls="navbarResponsive" aria-expanded="false" aria-label="Toggle navigation">
        <span class="navbar-toggler-icon"></span>
        </button>
            <div class="collapse navbar-collapse" id="navbarResponsive">
                <ul class="navbar-nav ml-auto">
                    <li class="nav-item"><a class="nav-link" href="#">Home</a></li>
                    <li class="nav-item"><a class="nav-link" href="#">Projects</a></li>
                    <li class="nav-item"><a class="nav-link" href="#">Blog</a></li>
                    <li class="nav-item"><a class="nav-link" href="#">Contact</a></li>
                </ul>
            </div>
        </div>
    </nav>