大規模なバッチジョブをより速く完了するために、いくつかのプロットを並行して実行しようとしています。この目的のために、私は作成する予定の各プロットのスレッドを開始します。
私は、各スレッドがプロットを終了してそれ自体を閉じることを望んでいました(私が理解しているように、Python run()のすべてのステートメントを通過するとスレッドを閉じます)。以下は次のコードを示しています。この動作。
図を作成する行をコメントアウトすると、期待どおりに実行されます。もう1つのもっともらしいヒントは、1つのスレッドのみを生成した場合にも期待どおりに実行されることです。
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()
どんな助けでも大歓迎です。
マルチプロセッシングを使用しないのはなぜですか?あなたの説明からわかる限り、とにかく、スレッド化はあまり役に立ちません...
Matplotlibはすでにスレッド化されているため、一度に複数の図を表示して操作できます。マルチコアマシンでのバッチ処理を高速化したい場合は、それに関係なくマルチプロセッシングが必要になります。
基本的な例として(警告:これにより、実行するディレクトリに20個の小さな.pngファイルが作成されます!)
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()
pylab
インターフェースには、解決策があります スレッドを使用した非同期プロット 。
pylab
がないと、matplotlibのバックエンド(Qt、GTK、WX、Tk)ごとに異なるソリューションが存在する可能性があります。問題は、各GUIツールキットにそれぞれ独自のGUIメインループがあることです。 ipython
がどのように処理するかがわかります。