是否可以并行运行两个python脚本并实时绘制?

问题描述 投票:0回答:2

我有两个Python脚本:第一个负责生成数据并将其保存在.csv文件中,第二个负责实时绘制此数据。我必须在控制台中运行第一个脚本,然后在控制台的新实例中运行第二个脚本。我想用一个脚本来做所有这些事情,但是我做不到。我尝试使用多处理,但失败了。我添加了2个脚本:

#THIS IS DATA GENERATING SCRIPT
import csv
import random
import time
import numpy as np



steps = 12000
shift = [-1, 0, 1]
start_corr_2D = [0, 0]
start_corr_3D = [0, 0, 0]

path_2D = np.zeros(shape=(steps,2)) 
path_3D = np.zeros(shape=(steps,3)) 

path_2D[0] = start_corr_2D
path_3D[0] = start_corr_3D

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):

    with open('data.csv', 'a') as csv_file:
        csv_writer = csv.DictWriter(csv_file, fieldnames=fieldnames)

        shift_2D = [random.choice(shift), random.choice(shift)]
        shift_3D = [random.choice(shift), random.choice(shift), random.choice(shift)]

        next_corr_2D = list(map(sum, zip(start_corr_2D, shift_2D)))
        next_corr_3D = list(map(sum, zip(start_corr_3D, shift_3D)))
        print(next_corr_2D)

        path_2D[i] = next_corr_2D
        path_3D[i] = next_corr_3D

        start_corr_2D = next_corr_2D
        start_corr_3D = next_corr_3D

        info = {
        "X": next_corr_2D[0],
        "Y": next_corr_2D[1],
        }

        csv_writer.writerow(info)

    time.sleep(0.3)
#THIS SCRIPT IS RESPONSIBLE FOR PLOTTING IN REAL TIME
import matplotlib.pyplot as plt
import pandas as pd
from matplotlib.animation import FuncAnimation

j = 0

def animate(i):
    data = pd.read_csv('data.csv')
    xs = data['X']
    ys = data['Y']

    global j
    j += 1
#    print(j)

    plt.cla()
#    plt.scatter(xs, ys, c='red', marker='*')

    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()


ani = FuncAnimation(plt.gcf(), animate, interval=300)

plt.tight_layout()
plt.show()

我现在正在执行此操作:enter image description here

但是我只想通过运行1个脚本来获得结果。我将不胜感激。

python matplotlib plot parallel-processing real-time
2个回答
0
投票

1。使用GNU并行:

 parallel -j -8 python ::: "$python_plot_scripts"

2。您可以绘制多个无花果:multiple_figs_demo

from matplotlib.path import Path
import matplotlib.patches as patches

3。用途:pyhdf


0
投票

多处理似乎是完成您要实现的目标的正确方法。但是,使用csv文件在两个进程之间进行通信非常危险。可以通过在两个过程之间使用队列将新数据发送到绘图来避免这种情况。

这是一个可能的实现(您可以将动画添加到其他文件中:

import csv
import random
import time
from multiprocessing import Process, Queue

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

def animate(q):
    xs = [0]
    ys = [1]
    def _animate(i):
        while not q.empty():
            x, y = q.get()
            xs.append(x)
            ys.append(y)
        plt.cla()
        #    plt.scatter(xs, ys, c='red', marker='*')

        if i < 10:
            plt.plot(xs, ys, c='blue', lw=0.6)
        elif 10 <= i < 50:
            plt.plot(xs, ys, c='red', lw=0.6)
        else:
            plt.plot(xs, ys, c='green', lw=0.6)

        plt.tight_layout()

    ani = FuncAnimation(plt.gcf(), _animate, interval=300)

    plt.tight_layout()
    plt.show()



def main():
    steps = 12000
    shift = [-1, 0, 1]
    start_corr_2D = [0, 0]
    start_corr_3D = [0, 0, 0]

    path_2D = np.zeros(shape=(steps,2))
    path_3D = np.zeros(shape=(steps,3))

    path_2D[0] = start_corr_2D
    path_3D[0] = start_corr_3D

    fieldnames = ["X", "Y"]
    data_queue = Queue()
    plot_process = Process(target=animate, args=(data_queue,))
    plot_process.start()


    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):

        with open('data.csv', 'a') as csv_file:
            csv_writer = csv.DictWriter(csv_file, fieldnames=fieldnames)

            shift_2D = [random.choice(shift), random.choice(shift)]
            shift_3D = [random.choice(shift), random.choice(shift), random.choice(shift)]

            next_corr_2D = list(map(sum, zip(start_corr_2D, shift_2D)))
            next_corr_3D = list(map(sum, zip(start_corr_3D, shift_3D)))

            path_2D[i] = next_corr_2D
            path_3D[i] = next_corr_3D

            start_corr_2D = next_corr_2D
            start_corr_3D = next_corr_3D

            info = {
            "X": next_corr_2D[0],
            "Y": next_corr_2D[1],
            }
            data_queue.put((next_corr_2D[0], next_corr_2D[1]))
            csv_writer.writerow(info)

        time.sleep(0.3)

    plot_process.join()

if __name__ == '__main__':
    main()
© www.soinside.com 2019 - 2024. All rights reserved.