考虑下面的例子
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/