使用Matplotlib Animation进行多处理

daolsyd0  于 2023-05-07  发布在  其他
关注(0)|答案(1)|浏览(208)

简而言之,我试图在后台计算数据的同时运行实时监控 Jmeter 板。下面是我的监控 Jmeter 板的代码:

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.animation import FuncAnimation
import psutil
import collections

# function to update the data
def monitor_machine_metrics(i):
    cpu_metrics.popleft()
    cpu_metrics.append(psutil.cpu_percent(interval=1))
    ram_metrics.popleft()
    ram_metrics.append(psutil.virtual_memory().percent)

    # clear axis
    ax.cla()
    ax1.cla()

    # plot cpu usage
    ax.plot(cpu_metrics)
    ax.text(len(cpu_metrics)-1, cpu_metrics[-1]+2, "{}%".format(cpu_metrics[-1]))
    ax.set_ylim(0,100)

    # plot memory usage
    ax1.plot(ram_metrics)
    ax1.text(len(ram_metrics)-1, ram_metrics[-1]+2, "{}%".format(ram_metrics[-1]))
    ax1.set_ylim(0,100)
    legend = plt.legend(['CPU Usage', 'RAM Usage'], loc='upper left')
    return legend

# start collections with zeros
cpu_metrics = collections.deque(np.zeros(10))
ram_metrics = collections.deque(np.zeros(10))
usage_fig = plt.figure()
ax = plt.subplot()
ax1 = plt.subplot()

def display_dynamic_data(figure, funct, time_interval):
    ani = FuncAnimation(figure, funct, interval=time_interval)
    plt.show()

为了保持简单,让我们假设我只是想在 Jmeter 板运行时打印hi。

if __name__ == '__main__': 
    machine_monitoring_process = 
    multiprocessing.Process(target=display_dynamic_data,args=(usage_fig, monitor_machine_metrics, 1000))
    machine_monitoring_process.start()

    print('Hi')

由于FuncAnimation的运行类似于一个无限循环,我特意设计了这个子过程完全解耦。当打印“hi”时,会出现图形,但不会显示任何点。但是,如果我们只是调用函数而不是将其示例化为子进程,display_dynamic_data就可以正常工作。不幸的是,我需要它并行运行,因为真实的的代码在后台进行计算。
我是不是漏掉了什么?

myzjeezk

myzjeezk1#

使用multiprocessing.Process时,将创建一个具有自己内存和对象的新进程。在新进程中运行的代码对原始进程没有影响。如果您想交换信息,您应该使用队列或其他类型的信息交换机制。
在您的示例中,display_dynamic_data在新进程中运行并退出。请记住,您必须保留对FuncAnimation对象的引用,以防止它被垃圾收集。
您可以检查this answer以了解使用多处理时会发生什么。

相关问题