python - Matplotlib图形卡在线程中。使用Thread.join()

标签 python multithreading matplotlib

考虑下面的例子

from time import sleep
import matplotlib.pyplot as plt
from threading import Thread
import numpy as np

class Monitor(Thread):
    def __init__(self):
        Thread.__init__(self)

        _, self.ax = plt.subplots()
        self.data = []

    def add_point(self, pt):
        self.data.append(pt)

        self.ax.cla()
        self.ax.plot(self.data)
        plt.draw()


class Main_job(Thread):

    def __init__(self, monitor):
        Thread.__init__(self)

        self.monitor = monitor

        self.output = []

    def run(self):
        for i in range(20):
            print(i)
            pt = np.random.rand()
            self.output.append(pt)
            self.monitor.add_point(pt)
            sleep(1)


monitor = Monitor()
monitor.start()

main = Main_job(monitor)
main.start()

我有一个执行长时间操作的Main_job线程,我想监视它的运行时。

因此,我为Thread图形定义了matplotlib,为我的流程定义了另一个。

代码可以正常运行

现在让我们说,在关闭程序之前,我想对Main_job线程的输出进行一些操作(例如,将其打印或保存到文件中)。

我在代码末尾添加了以下几行
main.join()
print(main.output)

但是,这以某种方式干扰了matplotlib,尽管它根本没有修改monitor线程,但现在挂起直到main完成。

如何等待main完成,但同时又避免monitor挂起?

编辑1-单线程(非工作)版本

根据FiddleStix的请求,这是代码的单线程版本。尽管简单得多,但在此版本中,该图已挂起,仅在过程结束时显示
from time import sleep
import matplotlib.pyplot as plt
import numpy as np

_, ax = plt.subplots()

output = []

for i in range(20):
    print(i)
    pt = np.random.rand()
    output.append(pt)

    ax.cla()
    ax.plot(output)

    sleep(1)

绘图后添加plt.pause(0.01)可以稍微改善这种情况。但是,通过这种方式可以显示图形,但是用户只能在0.01s内进行交互。

注意:我知道可以用sleep(1)代替plt.pause(1)来解决此问题,但是在这里sleep只是长时间执行真实代码中的代理,而不仅仅是暂停。

最佳答案

我认为您想使Monitor线程成为daemon线程(docs)。如果主线程停止,则守护程序线程将自动退出。这样,您可以使某些内容在后台运行,而无需显式停止第二个线程。

您只需添加类参数即可将线程声明为守护程序:

class Monitor(Thread):
    daemon = True

关于python - Matplotlib图形卡在线程中。使用Thread.join(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60523496/

相关文章:

Python INPUT 给出了错误的结果

python - 如何在 xlsxwriter 中添加列表?

Python - pandas ==> WINDOW 聚合

python - 在图表中扩展 matplotlib 线图

python - 为 mpld3 创建一个新插件

python - 如何使用参数从 bash 调用 python 脚本?

ios - 动画还在,当主线程做其他事情时

java - 在同一个 Process 对象上调用 Runtime.getRuntime.exec(commands) 两次

java - Spring-security session 在 java 线程中不可用

Python NetworkX MatplotLib DiGraph 查找路径长于两的所有树