메모
전체 예제 코드를 다운로드 하려면 여기 를 클릭 하십시오.
다중 프로세스 #
한 프로세스에서 데이터를 생성하고 다른 프로세스에서 플로팅하기 위해 다중 처리를 사용하는 데모.
로버트 킴먼이 각본을 맡은 작품
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()