Autor
|
Tema: Multiprocessing y MatPlotLib (Leído 3,501 veces)
|
Arhoc
Desconectado
Mensajes: 28
Welcome home, root!
|
Holaaa, estuve intentando plottear asincronamente en dos subplots, empleando lo que sea, Threads, Multiprocessing.Process y Pools, ¿Que puedo hacer? Por cierto, por cierto, al utilizar cualquiera de estos 3 me da error y no he podido emplearlos, mi codigo esta dividido en tres archivos, los cuales contienen: MAIN.PYimport numpy as np import matplotlib.pyplot as plt import multiprocessing import lines import bars if __name__ == "__main__": fig, ax = plt.subplots(2, 2) with multiprocessing.get_context("spawn").Pool() as pool: pool.map(lines.start, (plt, fig, ax[0, 0])) # Esto es de cuando intente utilizar SubProcesos """barproc = multiprocessing.Process(target=bars.start, args=(plt, fig, ax[0, 1])) procs.append(barproc) barproc.start() for proc in procs: proc.join()"""
LINES.PYimport numpy as np import matplotlib.pyplot as plt import matplotlib.animation as animation import random def start(plt, fig, ax): x = np.arange(0, 2*np.pi, 0.1) line1, = ax.plot(x, np.sin(x)) line2, = ax.plot(x, np.sin(x)) line3, = ax.plot(x, np.sin(x)) def animate(i): line1.set_ydata(np.sin(x - i / 50)) line2.set_ydata(np.sin(x + i / 75)) line3.set_ydata(np.sin(x - i / 100)) return line1, line2, line3 anim = animation.FuncAnimation(fig, animate, interval=1, blit=True, save_count=25) plt.show() if __name__ == "__main__": fig, ax = plt.subplots(2, 2) start(plt, fig, ax[0, 0])
BARS.PY: este es igual que el anterior pero usando graficas de barras :v Y el error que me da es este: Process SpawnPoolWorker-1: Traceback (most recent call last): File "/usr/lib/python3.10/multiprocessing/process.py", line 314, in _bootstrap self.run() File "/usr/lib/python3.10/multiprocessing/process.py", line 108, in run self._target(*self._args, **self._kwargs) File "/usr/lib/python3.10/multiprocessing/pool.py", line 114, in worker task = get() File "/usr/lib/python3.10/multiprocessing/queues.py", line 367, in get return _ForkingPickler.loads(res) File "/usr/lib/python3/dist-packages/matplotlib/figure.py", line 2911, in __setstate__ mgr = plt._backend_mod.new_figure_manager_given_figure(num, self) AttributeError: 'NoneType' object has no attribute 'new_figure_manager_given_figure' Process SpawnPoolWorker-2: Traceback (most recent call last): File "/usr/lib/python3.10/multiprocessing/process.py", line 314, in _bootstrap self.run() File "/usr/lib/python3.10/multiprocessing/process.py", line 108, in run self._target(*self._args, **self._kwargs) File "/usr/lib/python3.10/multiprocessing/pool.py", line 114, in worker task = get() File "/usr/lib/python3.10/multiprocessing/queues.py", line 367, in get return _ForkingPickler.loads(res) File "/usr/lib/python3/dist-packages/matplotlib/figure.py", line 2911, in __setstate__ mgr = plt._backend_mod.new_figure_manager_given_figure(num, self) AttributeError: 'NoneType' object has no attribute 'new_figure_manager_given_figure'
Entonces, umm, ¿que podria hacer yo para plottear en dos o mas subplots asincronamente?
|
|
|
En línea
|
free(Arhoc);
|
|
|
reymosquito
Desconectado
Mensajes: 81
|
debo ser honesto y decir que la verdad nunca e usado with con multiprocess, por lo cual te muestro que cambiaría: import numpy as np import matplotlib.pyplot as plt import multiprocessing from lines import start import bars if __name__ == "__main__": fig, ax = plt.subplots(2, 2) context =multiprocessing.get_context("spawn") proceso = context.Process(start(plt, fig, ax[0, 0] ))
con eso ya debería funcionar y a partir de ahí las modificciones pertinentes con las funciones start y join
|
|
|
En línea
|
|
|
|
Arhoc
Desconectado
Mensajes: 28
Welcome home, root!
|
Me anda, sin embargo no se realiza asincronamente, ¿hay algo mas que deba hacer?
|
|
|
En línea
|
free(Arhoc);
|
|
|
Arhoc
Desconectado
Mensajes: 28
Welcome home, root!
|
debo ser honesto y decir que la verdad nunca e usado with con multiprocess, por lo cual te muestro que cambiaría: import numpy as np import matplotlib.pyplot as plt import multiprocessing from lines import start import bars if __name__ == "__main__": fig, ax = plt.subplots(2, 2) context =multiprocessing.get_context("spawn") proceso = context.Process(start(plt, fig, ax[0, 0] ))
con eso ya debería funcionar y a partir de ahí las modificciones pertinentes con las funciones start y join perfecto, sin utilizar target y args no da asincronamente, pero usandolos da error: import numpy as np import matplotlib.pyplot as plt import multiprocessing import lines import bars if __name__ == "__main__": fig, ax = plt.subplots(2, 2) context = multiprocessing.get_context("spawn") proc1 = context.Process(target=lines.start, args=(plt, fig, ax[0, 0])) proc2 = context.Process(target=bars.start, args=(plt, fig, ax[1, 1])) proc1.start() proc2.start()
|
|
|
En línea
|
free(Arhoc);
|
|
|
Arhoc
Desconectado
Mensajes: 28
Welcome home, root!
|
perfecto, sin utilizar target y args no da asincronamente, pero usandolos da error: import numpy as np import matplotlib.pyplot as plt import multiprocessing import lines import bars if __name__ == "__main__": fig, ax = plt.subplots(2, 2) context = multiprocessing.get_context("spawn") proc1 = context.Process(target=lines.start, args=(plt, fig, ax[0, 0])) proc2 = context.Process(target=bars.start, args=(plt, fig, ax[1, 1])) proc1.start() proc2.start()
ah no ese no era Traceback (most recent call last): File "/home/arhoc/scientistsimulator/main.py", line 15, in <module> proc1.start() File "/usr/lib/python3.10/multiprocessing/process.py", line 121, in start self._popen = self._Popen(self) File "/usr/lib/python3.10/multiprocessing/context.py", line 288, in _Popen return Popen(process_obj) File "/usr/lib/python3.10/multiprocessing/popen_spawn_posix.py", line 32, in __init__ super().__init__(process_obj) File "/usr/lib/python3.10/multiprocessing/popen_fork.py", line 19, in __init__ self._launch(process_obj) File "/usr/lib/python3.10/multiprocessing/popen_spawn_posix.py", line 47, in _launch reduction.dump(process_obj, fp) File "/usr/lib/python3.10/multiprocessing/reduction.py", line 60, in dump ForkingPickler(file, protocol).dump(obj) TypeError: cannot pickle 'module' object
|
|
|
En línea
|
free(Arhoc);
|
|
|
reymosquito
Desconectado
Mensajes: 81
|
ahora no estoy con posibilidad de mirarlo, mañana lo veo.
|
|
|
En línea
|
|
|
|
Arhoc
Desconectado
Mensajes: 28
Welcome home, root!
|
Ya lo solucione, de hecho nisiquiera emplee programacion asincrona / concurrente
|
|
|
En línea
|
free(Arhoc);
|
|
|
|
|