问题描述
我正在尝试运行两个进程——一个通过 Queue() 传递数据,另一个读取队列并同时绘制它。代码工作没有错误,只是情节没有显示。两个过程都完成后只出现空图。
我希望任何人都可以在我的代码中找到问题。提前致谢!
import multiprocessing as mp
import random
from matplotlib import pyplot as plt
import time
fig = plt.figure(figsize = (5,5))
def worker():
for i in range(20):
q.put(random.random())
t.put(random.random())
# time.sleep(0.01)
def plotter(q,t):
while not q.empty():
x = q.get()
y = t.get()
print(x,y)
plt.scatter(x,y)
# plt.show()
time.sleep((0.1))
if __name__ == '__main__':
q = mp.Queue()
t = mp.Queue()
r = mp.Process(target = plotter,args = (q,t))
p = mp.Process(target = worker)
p.start()
r.start()
p.join()
r.join()
解决方法
我通过更改绘图仪方法使其运行,如下所示:
def plotter(q,t):
plt.figure(figsize=(5,5))
while not q.empty():
x = q.get()
y = t.get()
print(x,y)
plt.scatter(x,y)
time.sleep((0.1))
plt.show()
我将 plt.figure
移到方法中,因为它没有在进程之间共享。它只在主进程中执行,而不是r
。
在第一次运行时,我不得不在进程开始之间放置一个 time.sleep()
。否则队列中没有任何内容,plotter
立即完成。
当然,将 plt.show()
放在循环之外。