如何在函数之间实时共享变量

时间:2019-04-22 20:33:09

标签: python

我有一个软件工程项目(使用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函数生成的数据。任何提示或方向将不胜感激!

1 个答案:

答案 0 :(得分:0)

几种方法,取决于您遇到的确切问题:

  1. 使用线程而不是多处理。并行进程将不会共享相同的上下文,因此不会共享变量。但是,线程允许这样做。但是在Python中,您将遇到GIL问题,如果一个线程是I / O绑定的,而另一个线程是CPU的绑定的,则可能不必担心。

  2. 有关在进程之间使用https://docs.python.org/3.4/library/multiprocessing.html#exchanging-objects-between-processes的示例,请参见Queue。您的数据是单向传递的,因此一个队列就足够了。

  3. 使用一些花哨的东西,例如消息队列服务器等。如果可以预见该程序可以大规模发展,那么可以使用多层体系结构。

    < / li>