简而言之,我试图在后台计算数据的同时运行实时监控 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就可以正常工作。不幸的是,我需要它并行运行,因为真实的的代码在后台进行计算。
我是不是漏掉了什么?
1条答案
按热度按时间myzjeezk1#
使用
multiprocessing.Process
时,将创建一个具有自己内存和对象的新进程。在新进程中运行的代码对原始进程没有影响。如果您想交换信息,您应该使用队列或其他类型的信息交换机制。在您的示例中,
display_dynamic_data
在新进程中运行并退出。请记住,您必须保留对FuncAnimation
对象的引用,以防止它被垃圾收集。您可以检查this answer以了解使用多处理时会发生什么。