gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 13:07:34 25 4
gpt4 key购买 nike

考虑下面的例子

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com