Note

Go to the endto download the full example code.

Multiprocessing#

Demo of using multiprocessing for generating data in one process andplotting in another.

Written by Robert Cimrman

importmultiprocessingasmpimporttimeimportmatplotlib.pyplotaspltimportnumpyasnp# Fixing random state for reproducibilitynp.random.seed(19680801)

Processing Class#

This class plots data it receives from a pipe.

classProcessPlotter:def__init__(self):self.x=[]self.y=[]defterminate(self):plt.close('all')defcall_back(self):whileself.pipe.poll():command=self.pipe.recv()ifcommandisNone:self.terminate()returnFalseelse:self.x.append(command[0])self.y.append(command[1])self.ax.plot(self.x,self.y,'ro')self.fig.canvas.draw()returnTruedef__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()

Plotting class#

This class uses multiprocessing to spawn a process to run code from theclass above. When initialized, it creates a pipe and an instance ofProcessPlotter which will be run in a separate process.

When run from the command line, the parent process sends data to the spawnedprocess which is then plotted via the callback function specified inProcessPlotter:__call__.

classNBPlot: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()defplot(self,finished=False):send=self.plot_pipe.sendiffinished:send(None)else:data=np.random.random(2)send(data)defmain():pl=NBPlot()for_inrange(10):pl.plot()time.sleep(0.5)pl.plot(finished=True)if__name__=='__main__':ifplt.get_backend()=="MacOSX":mp.set_start_method("forkserver")main()

Gallery generated by Sphinx-Gallery