Matplotlib: одновременное построение в несколько потоков

Я пытаюсь сделать некоторые построения параллельно, чтобы быстрее завершить большие пакетные задания. С этой целью я запускаю поток для каждого сюжета, который планирую создать.

Я надеялся, что каждый поток закончит свое построение и закроется (насколько я понимаю, Python закрывает потоки, когда они проходят все операторы в run ()). Ниже приведен код, демонстрирующий такое поведение.

Если строка, создающая фигуру, закомментирована, она выполняется, как ожидалось. Еще один весьма полезный лакомый кусочек заключается в том, что он также работает должным образом, когда вы создаете только один поток.

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()

Любая помощь приветствуется.

19
задан skaffman 11 January 2011 в 16:10
поделиться