2011-01-11 13 views
13

birden çok iş parçacığı aynı anda çizimi. Bu amaçla, yapmayı planladığım her arsa için bir iplik başlarım.Matplotlib: Ben çabuk büyük toplu işleri bitirmek için paralel bazı komplo yapmaya çalışıyorum

Her iş parçacığı kendi komplo bitirip kendisini kapatmak edeceğini umduğu (Anladığım kadarıyla onlar vadede bütün tabloların yoluyla olsun, Python konuları kapatır()). Aşağıda bu davranışı gösteren bir kod var. bir figür oluşturur çizgi dışarı yorum Eğer beklendiği gibi

, bu çalışır. Bir başka makul yardımcı tidbit, sadece bir iş parçacığı oluşturduğunuzda beklendiği gibi çalıştığıdır.

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

Herhangi bir yardım için teşekkür ederiz.

+3

Aslında yanlış giderse ne dedi değil ettik, bu gibi sesler rağmen Bir çeşit iş ortaklığı eşzamanlılığı sorunu. –

+0

Neyin yanlış gittiğinden emin değilim. Hiçbir hata alamıyorum ve bir python işlemi devam ediyor. Ayrıca, her saniye kapalı olan ana iş parçasındaki yazdırma ifadesi, ilk saniyeden sonra bunu yapmaz. Görev yöneticisine bir bakış, işlemin bir çok CPU'yu kullanmaya devam ettiğini gösterir. Maalesef, ciddi hata ayıklama konusunda sınırlı tecrübem var. – Boris

+0

MakeTapHist(). Start() 'işlevini birden çok kez çağırmak mı istiyorsunuz? Görünüşe göre belki de döngü dışında olmalı. –

cevap

4

pylab arabirimi için, bir çözelti Asynchronous plotting with threads vardır. pylab olmadan

her Matplotlib en arka ucu (QT GTK WX, TK) için farklı çözümler olabilir. Sorun, her GUI araç setinin her bir GUI mainloopuna sahip olmasıdır. ipython ile nasıl anlaştıklarını görebilirsiniz.

+2

Söyleyebildiğim gibi, sağlanan bağlantı, birçok parçacığın paralel olarak nasıl grafik çizileceğini değil, tek bir şekil ile nasıl çalışılacağını gösterir. Anladığım kadarıyla, matplotlib'i etkileşimli olarak kullanırken (ipython gibi) arka planlar dikkate alınmalıdır. Bu örneğe nasıl uygulandıklarını açıklayabilirseniz memnun olurum. – Boris

+0

@Boris: backend, örneğin http://ideone.com/J42rn, varsayılan arka uçla segmentasyon hatası oluşturur. – jfs

+2

btw, 'multiprocessing' vesrion çok daha hızlı http://ideone.com/lFXOT – jfs

18

Neden çoklu işlemeyi kullanmıyorsunuz? Görüntülemek ve bir kerede birden rakamlar ile etkileşim böylece Bildiğim kadarıyla sizin açıklamasından söyleyebilirim, parçacığı ... Neyse, çok

Matplotlib zaten konuları size yardımcı olmayacaktır. Çok çekirdekli bir makinede toplu işlemeyi hızlandırmak istiyorsanız, bağımsız olarak çok işlemeye ihtiyacınız olacak. Temel bir örnek olarak

( Uyarı: Bu onu çalıştırmak ne olursa olsun dizin içinde 20 küçük .png dosyaları yaratacak!)

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

web arşivi bağlantısını işaret ettim. Ayrıca "çok işlem" versiyonu, "iş parçacığı" sürümüyle karşılaştırıldığında süper hızlı – jfs

İlgili konular