소개
이 랩에서는 multiprocessing 라이브러리와 Matplotlib 를 사용하여 별도의 프로세스에서 생성된 데이터를 플롯하는 방법을 배우게 됩니다. 플로팅과 데이터 생성을 각각 처리하기 위해 ProcessPlotter와 NBPlot이라는 두 개의 클래스를 생성할 것입니다. NBPlot 클래스는 임의의 데이터를 생성하여 파이프를 통해 ProcessPlotter 클래스로 전송하고, ProcessPlotter 클래스는 이 데이터를 실시간으로 플롯합니다.
VM 팁
VM 시작이 완료되면 왼쪽 상단을 클릭하여 Notebook 탭으로 전환하여 실습을 위해 Jupyter Notebook에 액세스하십시오.
때로는 Jupyter Notebook 이 로딩을 완료하는 데 몇 초 정도 기다려야 할 수 있습니다. Jupyter Notebook 의 제한 사항으로 인해 작업의 유효성 검사는 자동화할 수 없습니다.
학습 중에 문제가 발생하면 Labby 에게 문의하십시오. 세션 후 피드백을 제공해주시면 문제를 즉시 해결해 드리겠습니다.
라이브러리 임포트
필요한 라이브러리를 임포트하는 것으로 시작합니다. 별도의 프로세스를 처리하기 위해 multiprocessing을 사용하고, 시간 지연을 위해 time을 사용하며, 임의의 데이터를 생성하기 위해 numpy를 사용하고, 플로팅을 위해 matplotlib을 사용합니다.
import multiprocessing as mp
import time
import numpy as np
import matplotlib.pyplot as plt
ProcessPlotter 클래스 정의
ProcessPlotter 클래스는 파이프를 통해 전송된 데이터의 플로팅을 처리합니다. 이 클래스는 파이프에서 새로운 데이터를 지속적으로 확인하고 실시간으로 플롯합니다.
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()
NBPlot 클래스 정의
NBPlot 클래스는 임의의 데이터를 생성하여 파이프를 통해 ProcessPlotter 클래스로 전송합니다.
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)
NBPlot 인스턴스 생성 및 ProcessPlotter에 데이터 전송
NBPlot 클래스의 인스턴스를 생성하고 임의의 데이터를 ProcessPlotter 클래스로 전송합니다. 10 개의 데이터 세트를 전송하며, 각 세트 사이에는 0.5 초의 지연이 있습니다.
def main():
pl = NBPlot()
for _ 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()
요약
이 랩에서는 multiprocessing 라이브러리와 Matplotlib 을 사용하여 별도의 프로세스에서 생성된 데이터를 플로팅하는 방법을 배웠습니다. 플로팅과 데이터 생성을 각각 처리하기 위해 ProcessPlotter와 NBPlot 두 개의 클래스를 생성했습니다. NBPlot 클래스는 임의의 데이터를 생성하여 파이프를 통해 ProcessPlotter 클래스로 전송했으며, ProcessPlotter는 이 데이터를 실시간으로 플로팅했습니다.