<jupyter_start><jupyter_text>MultiprocessDemo of using multiprocessing for generating data in one process andplotting in another.Written by <NAME><jupyter_code>import multiprocessing as mp
import time

import matplotlib.pyplot as plt
import numpy as np

# Fixing random state for reproducibility
np.random.seed(19680801)<jupyter_output><empty_output><jupyter_text>Processing Class================This class plots data it receives from a pipe.<jupyter_code>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()<jupyter_output><empty_output><jupyter_text>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 of``ProcessPlotter`` 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 in``ProcessPlotter:__call__``.<jupyter_code>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()<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.11281224818694602, 'fraction_numerical': 0.007655116841257051, 'mean_word_length': 2.651470588235294, 'pattern_counts': {'":': 1, '<': 14, '<?xml version=': 0, '>': 14, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '3', 'dir': 'jupyter-structured-clean-dedup', 'id': '623813', 'license': 'MIT', 'n_tokens_mistral': 775, 'n_tokens_neox': 732, 'n_words': 189, 'path': 'matplotlib/gallery_jupyter/misc/multiprocess_sgskip.ipynb', 'repo_name': 'kingreatwill/penter', 'size': '2490'}