如何合并数据生成与实时绘图的Python脚本,实现并行运行?
解决方案:用multiprocessing整合数据生成与实时绘图
没问题!我帮你把两个脚本合并成一个,通过multiprocessing实现并行运行,这样你只需要启动一次脚本,就能同时完成数据生成和实时绘图的任务。之前用multiprocessing没成功可能是因为没正确封装函数或者没处理好进程启动的规范(比如Windows下必须的if __name__ == '__main__'判断)。
下面是整合后的完整代码:
import csv import random import time import numpy as np import matplotlib.pyplot as plt import pandas as pd from matplotlib.animation import FuncAnimation import multiprocessing # 数据生成函数 def generate_data(): steps = 12000 shift = [-1, 0, 1] start_corr_2D = [0, 0] fieldnames = ["X", "Y"] # 先创建并写入表头 with open('data.csv', 'w') as csv_file: csv_writer = csv.DictWriter(csv_file, fieldnames=fieldnames) csv_writer.writeheader() info = { "X": start_corr_2D[0], "Y": start_corr_2D[1], } csv_writer.writerow(info) # 逐步生成数据并追加写入 for i in range(1, steps): shift_2D = [random.choice(shift), random.choice(shift)] next_corr_2D = list(map(sum, zip(start_corr_2D, shift_2D))) print(next_corr_2D) start_corr_2D = next_corr_2D with open('data.csv', 'a') as csv_file: csv_writer = csv.DictWriter(csv_file, fieldnames=fieldnames) info = { "X": next_corr_2D[0], "Y": next_corr_2D[1], } csv_writer.writerow(info) time.sleep(0.3) # 实时绘图函数 def plot_data(): j = 0 def animate(i): nonlocal j data = pd.read_csv('data.csv') xs = data['X'] ys = data['Y'] j += 1 plt.cla() if j < 10: plt.plot(xs, ys, c='blue', lw=0.6) elif j >= 10 and j < 50: plt.plot(xs, ys, c='red', lw=0.6) else: plt.plot(xs, ys, c='green', lw=0.6) plt.tight_layout() # 初始化绘图窗口 plt.figure() ani = FuncAnimation(plt.gcf(), animate, interval=300) plt.tight_layout() plt.show() if __name__ == '__main__': # 创建两个进程,分别处理数据生成和绘图 data_process = multiprocessing.Process(target=generate_data) plot_process = multiprocessing.Process(target=plot_data) # 启动进程 data_process.start() plot_process.start() # 等待进程结束 data_process.join() plot_process.join()
关键说明:
- 函数封装:把原来两个脚本的逻辑分别封装成
generate_data()和plot_data()函数,方便多进程调用。 - 进程启动规范:在
if __name__ == '__main__':块内创建和启动进程,这是Windows系统下使用multiprocessing的必要条件,避免递归创建子进程的问题。 - 变量作用域:绘图函数里的
j用nonlocal替代global,更符合函数内的变量作用域规范(原来的global在单脚本里没问题,但封装成函数后用nonlocal更合适)。 - 同步性:数据生成的间隔是
0.3s,绘图的更新间隔是300ms,两者保持一致,确保绘图能实时获取最新数据。
运行这个脚本后,你会看到控制台打印生成的坐标,同时弹出绘图窗口实时更新路径,完全不需要分开启动两个脚本啦!
内容的提问来源于stack exchange,提问作者BS98
相关产品推荐
相关产品推荐

