다중 프로세스 #

한 프로세스에서 데이터를 생성하고 다른 프로세스에서 플로팅하기 위해 다중 처리를 사용하는 데모.

로버트 킴먼이 각본을 맡은 작품

import multiprocessing as mp
import time

import matplotlib.pyplot as plt
import numpy as np

# Fixing random state for reproducibility
np.random.seed(19680801)

처리 클래스 #

이 클래스는 파이프에서 받은 데이터를 플로팅합니다.

class ProcessPlotter:
    def __init__(self):
        self.x = []
        self.y = []

    def terminate(self):
        plt.close('all')

    def call_back(self):
        while self.pipe.poll():
            command = self.pipe.recv()
            if command is None:
                self.terminate()
                return False
            else:
                self.x.append(command[0])
                self.y.append(command[1])
                self.ax.plot(self.x, self.y, 'ro')
        self.fig.canvas.draw()
        return True

    def __call__(self, pipe):
        print('starting plotter...')

        self.pipe = pipe
        self.fig, self.ax = plt.subplots()
        timer = self.fig.canvas.new_timer(interval=1000)
        timer.add_callback(self.call_back)
        timer.start()

        print('...done')
        plt.show()

플로팅 클래스 #

이 클래스는 다중 처리를 사용하여 위 클래스의 코드를 실행하는 프로세스를 생성합니다. ProcessPlotter초기화되면 별도의 프로세스에서 실행될 파이프와 인스턴스를 생성합니다 .

명령줄에서 실행할 때 상위 프로세스는 생성된 프로세스로 데이터를 보낸 다음 에 지정된 콜백 함수를 통해 플로팅됩니다 ProcessPlotter:__call__.

class NBPlot:
    def __init__(self):
        self.plot_pipe, plotter_pipe = mp.Pipe()
        self.plotter = ProcessPlotter()
        self.plot_process = mp.Process(
            target=self.plotter, args=(plotter_pipe,), daemon=True)
        self.plot_process.start()

    def plot(self, finished=False):
        send = self.plot_pipe.send
        if finished:
            send(None)
        else:
            data = np.random.random(2)
            send(data)


def main():
    pl = NBPlot()
    for ii in range(10):
        pl.plot()
        time.sleep(0.5)
    pl.plot(finished=True)


if __name__ == '__main__':
    if plt.get_backend() == "MacOSX":
        mp.set_start_method("forkserver")
    main()

Sphinx-Gallery에서 생성한 갤러리