多进程
演示使用多处理在一个过程中生成数据并在另一个过程中绘图。
由Robert Cimrman撰写
import multiprocessing as mpimport timeimport matplotlib.pyplot as pltimport numpy as np# Fixing random state for reproducibilitynp.random.seed(19680801)
进程类
此类绘制从管道接收的数据。
class ProcessPlotter(object):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 Falseelse:self.x.append(command[0])self.y.append(command[1])self.ax.plot(self.x, self.y, 'ro')self.fig.canvas.draw()return Truedef __call__(self, pipe):print('starting plotter...')self.pipe = pipeself.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(object):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.sendif 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()
