我有一个软件工程项目(使用python),最终目的是实时绘制数据。为简单起见,假设我有这两个独立的函数,一个函数用于生成数据,另一个函数使用matplotlib
实时绘制(刚刚生成的)数据,问题是我如何拥有这两个并行运行的函数共享相同的变量?
我研究了multiprocessing
,并且使两个函数同时运行。但是,我无法让他们实时共享数据。这是我所拥有的:
import time
import datetime as dt
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import random
import multiprocessing as mp
def live_graph():
# Create figure for plotting
fig1 = plt.figure(1)
ax1 = fig1.add_subplot(1, 1, 1)
xs = []
ys_temperature = []
# This function is called periodically from FuncAnimation
def animate_temperature(i, xs, ys_temperature):
# Add x and y to lists
xs.append(dt.datetime.now().strftime('%H:%M:%S.%f'))
ys_temperature.append(random.randint(-55, 55))
# Limit x and y lists to 20 items
xs = xs[-20:]
ys_temperature = ys_temperature[-20:]
# Draw x and y lists
ax1.clear()
ax1.plot(xs, ys_temperature)
# Format plot
plt.xticks(rotation=45, ha='right')
plt.subplots_adjust(bottom=0.30)
plt.title('Temperature over Time')
plt.ylabel('Temperature (deg C)')
ani_temperature = animation.FuncAnimation(fig1, animate_temperature, fargs=(xs, ys_temperature), interval=1000)
plt.show()
def gen_data():
while True:
temperature = random.randint(500, 1000)
print(temperature)
time.sleep(1)
if __name__ == '__main__':
one = mp.Process(target=gen_data)
two = mp.Process(target=live_graph)
one.start()
two.start()
现在,live_graph
函数只是在绘制任意数据。我希望它能绘制由gen_data
函数生成的数据。任何提示或方向将不胜感激!
答案 0 :(得分:0)
几种方法,取决于您遇到的确切问题:
使用线程而不是多处理。并行进程将不会共享相同的上下文,因此不会共享变量。但是,线程允许这样做。但是在Python中,您将遇到GIL问题,如果一个线程是I / O绑定的,而另一个线程是CPU的绑定的,则可能不必担心。
有关在进程之间使用https://docs.python.org/3.4/library/multiprocessing.html#exchanging-objects-between-processes的示例,请参见Queue。您的数据是单向传递的,因此一个队列就足够了。
使用一些花哨的东西,例如消息队列服务器等。如果可以预见该程序可以大规模发展,那么可以使用多层体系结构。
< / li>