Estoy tratando de hacer un trazado en paralelo para terminar grandes trabajos por lotes más rápido. Con este fin, comienzo un hilo por cada trama que planeo hacer.Matplotlib: trazado simultáneo en múltiples hilos
Tenía la esperanza de que cada subproceso terminara su trazado y se cerrara (como yo lo entiendo, Python cierra los hilos cuando pasan por todas las instrucciones 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 esperaba. Otro tidbit plausiblemente útil es que también se ejecuta como se esperaba cuando solo generas 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.
Usted no ha dicho realmente lo que va mal, aunque suene algún tipo de problema de concurrencia de hilo. –
No estoy seguro de qué va mal. No recibo ningún error y el proceso de Python continúa ejecutándose. Además, la instrucción de impresión en el hilo principal que debería activarse cada segundo no lo hace después del primer segundo. Una mirada en el administrador de tareas muestra que el proceso continúa usando una gran cantidad de la CPU. Tengo una experiencia limitada en depuración seria, desafortunadamente. – Boris
¿Tiene intención de llamar 'makeTapHist(). Start()' varias veces? Parece que quizás debería estar fuera del circuito. –