Matplotlib: trazado simultáneo en múltiples hilos

Estoy tratando de hacer un trazado en paralelo para terminar los trabajos de lotes grandes más rápido. Con este fin, comienzo un hilo para cada plot que planeo hacer.

Esperaba que cada hilo terminara su trazado y se cerrara (como lo entiendo, Python cierra los hilos cuando pasan por todas las declaraciones en run ()). A continuación se muestra un código que muestra este comportamiento.

Si la línea que crea una figura está comentada, se ejecuta como se espera. Otro dato plausiblemente útil es que también se ejecuta como se esperaba cuando solo genera un hilo.

import matplotlib.pyplot as plt import time import Queue import threading def TapHistplots(): ## for item in ['str1']: # # it behaves as expected if the line above is used instead of the one below for item in ['str1','str2']: otheritem = 1 TapHistQueue.put((item, otheritem)) makeTapHist().start() class makeTapHist(threading.Thread): def run(self): item, otheritem = TapHistQueue.get() fig = FigureQueue.get() FigureQueue.put(fig+1) print item+':'+str(fig)+'\n', time.sleep(1.3) plt.figure(fig) # comment out this line and it behaves as expected plt.close(fig) TapHistQueue = Queue.Queue(0) FigureQueue = Queue.Queue(0) def main(): start = time.time() """Code in here runs only when this module is run directly""" FigureQueue.put(1) TapHistplots() while threading.activeCount()>1: time.sleep(1) print 'waiting on %d threads\n' % (threading.activeCount()-1), print '%ds elapsed' % (time.time()-start) if __name__ == '__main__': main() 

Cualquier ayuda es debidamente apreciada.

¿Por qué no usar simplemente el multiprocesamiento? Por lo que puedo decir de su descripción, el enhebrado no le ayudará mucho, de todos modos …

Matplotlib ya está en subprocesos para que puedas visualizar e interactuar con varias figuras a la vez. Si desea acelerar el procesamiento por lotes en una máquina multinúcleo, necesitará el multiprocesamiento independientemente.

Como ejemplo básico ( Advertencia: ¡Esto creará 20 pequeños archivos .png en cualquier directorio en el que lo ejecute! )

 import multiprocessing import matplotlib.pyplot as plt import numpy as np def main(): pool = multiprocessing.Pool() num_figs = 20 input = zip(np.random.randint(10,1000,num_figs), range(num_figs)) pool.map(plot, input) def plot(args): num, i = args fig = plt.figure() data = np.random.randn(num).cumsum() plt.plot(data) plt.title('Plot of a %i-element brownian noise sequence' % num) fig.savefig('temp_fig_%02i.png' % i) main() 

Para la interfaz de pylab existe una solución de trazado asíncrono con hilos .

Sin pylab , podría haber diferentes soluciones para los backends de cada matplotlib (Qt, GTK, WX, Tk). El problema es que cada kit de herramientas de GUI tiene su propio mainhope de GUI. Usted podría ver cómo ipython trata con él.