多进程
演示使用多处理在一个过程中生成数据并在另一个过程中绘图。
由Robert Cimrman撰写
1 2 3 4 5 6 7 8
| import multiprocessing as mp import time
import matplotlib.pyplot as plt import numpy as np
np.random.seed(19680801)
|
进程类
此类绘制从管道接收的数据。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| 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 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。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| 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.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()
|
下载这个示例