You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何合并数据生成与实时绘图的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 19:17:46