Sto provando a fare un po 'di tracciamento in parallelo per finire i grandi lavori batch più velocemente. A tal fine, inizio un thread per ogni trama che ho intenzione di realizzare.Matlotlib: tracciamento simultaneo in più thread
Avevo sperato che ogni thread terminasse il suo plottaggio e si chiudesse (a quanto ho capito, Python chiude i thread quando ottengono tutte le istruzioni di run()). Di seguito è riportato un codice che mostra questo comportamento.
Se la linea che crea una figura è commentata, viene eseguita come previsto. Un altro utile tidbit è che gira anche come previsto quando si genera solo un thread.
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()
Qualsiasi aiuto è debitamente apprezzato.
Non hai effettivamente detto ciò che va male, anche se suona come una sorta di problema di concorrenza di thread. –
Non sono sicuro di cosa vada storto. Non ricevo errori e un processo Python continua a funzionare. Inoltre, l'istruzione di stampa nel thread principale che dovrebbe essere disattivata ogni secondo non lo fa dopo il primo secondo. Un'occhiata nel task manager mostra che il processo continua a utilizzare molta della CPU. Purtroppo ho un'esperienza limitata nel debug serio. – Boris
È tua intenzione chiamare 'makeTapHist(). Start()' più volte? Sembra che forse dovrebbe essere fuori dal giro. –