Sophie

Sophie

distrib > Mandriva > 2010.2 > i586 > media > contrib-backports > by-pkgid > a44f8c7e78ee9c5838c1fb080c9e7630 > files > 1169

python-matplotlib-doc-1.1.1-1mdv2010.1.noarch.rpm

.. _misc-multiprocess:

misc example code: multiprocess.py
==================================

[`source code <multiprocess.py>`_]

::

    #Demo of using multiprocessing for generating data in one process and plotting
    #in another.
    #Written by Robert Cimrman
    #Requires >= Python 2.6 for the multiprocessing module or having the
    #standalone processing module installed
    import time
    try:
        from multiprocessing import Process, Pipe
    except ImportError:
        from processing import Process, Pipe
    import numpy as np
    
    import matplotlib
    matplotlib.use('GtkAgg')
    import matplotlib.pyplot as plt
    import gobject
    
    class ProcessPlotter(object):
    
        def __init__(self):
            self.x = []
            self.y = []
    
        def terminate(self):
            plt.close('all')
    
        def poll_draw(self):
    
            def call_back():
                while 1:
                    if not self.pipe.poll():
                        break
    
                    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
    
            return call_back
    
        def __call__(self, pipe):
            print 'starting plotter...'
    
            self.pipe = pipe
            self.fig = plt.figure()
    
            self.ax = self.fig.add_subplot(111)
            self.gid = gobject.timeout_add(1000, self.poll_draw())
    
            print '...done'
            plt.show()
    
    
    class NBPlot(object):
        def __init__(self):
            self.plot_pipe, plotter_pipe = Pipe()
            self.plotter = ProcessPlotter()
            self.plot_process = Process(target = self.plotter,
                                        args = (plotter_pipe,))
            self.plot_process.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 xrange(10):
            pl.plot()
            time.sleep(0.5)
        raw_input('press Enter...')
        pl.plot(finished=True)
    
    if __name__ == '__main__':
        main()
    

Keywords: python, matplotlib, pylab, example, codex (see :ref:`how-to-search-examples`)