2011-01-11 36 views
13

Tôi đang cố gắng làm một số âm mưu song song để hoàn thành công việc hàng loạt lớn nhanh hơn. Để kết thúc này, tôi bắt đầu một chủ đề cho mỗi cốt truyện tôi có kế hoạch làm.Matplotlib: đồng thời vẽ trong nhiều chủ đề

Tôi đã hy vọng rằng mỗi chuỗi sẽ kết thúc âm mưu của nó và đóng chính nó (như tôi đã hiểu nó, Python đóng chủ đề khi chúng vượt qua tất cả các câu lệnh trong run()). Dưới đây là một số mã cho thấy hành vi này.

Nếu dòng tạo hình được nhận xét, nó chạy như mong đợi. Một miếng ngon đáng tin cậy khác là nó cũng chạy như mong đợi khi bạn chỉ sinh ra một sợi.

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

Mọi trợ giúp đều được đánh giá cao.

+3

Bạn đã không thực sự nói gì sai, mặc dù nó có vẻ như một số loại vấn đề đồng thời luồng. –

+0

Tôi không thực sự chắc chắn điều gì sai. Tôi không nhận được bất kỳ lỗi nào và quá trình python tiếp tục chạy. Ngoài ra, lệnh in trong chuỗi chính sẽ bị tắt sau mỗi giây không làm như vậy sau giây đầu tiên. Một cái nhìn trong trình quản lý tác vụ cho thấy rằng quá trình tiếp tục sử dụng rất nhiều cpu. Tôi không có kinh nghiệm hạn chế trong việc gỡ lỗi nghiêm trọng. – Boris

+0

Bạn có ý định gọi 'makeTapHist(). Start()' nhiều lần không? Có vẻ như nó nên ở bên ngoài vòng lặp. –

Trả lời

4

Đối với giao diện pylab có giải pháp Asynchronous plotting with threads.

Nếu không có pylab, có thể có các giải pháp khác nhau cho mỗi phụ trợ của matplotlib (Qt, GTK, WX, Tk). Vấn đề là mỗi bộ công cụ GUI có mỗi mainloop GUI riêng. Bạn có thể xem cách ipython giải quyết vấn đề này.

+2

Tức là như tôi có thể nói, liên kết được cung cấp cho thấy cách làm việc với một hình duy nhất từ ​​nhiều luồng chứ không phải cách tạo các ô song song. Như tôi đã hiểu, các phụ trợ rất quan trọng để tính đến khi sử dụng matplotlib tương tác (như ipython). Tôi đánh giá cao nếu bạn có thể giải thích cách họ áp dụng cho ví dụ này. – Boris

+0

@Boris: chương trình phụ trợ không quan trọng, ví dụ: http://ideone.com/J42rn tạo lỗi phân đoạn với chương trình phụ trợ mặc định. – jfs

+2

btw, 'đa xử lý' vesrion nhanh hơn nhiều http://ideone.com/lFXOT – jfs

18

Tại sao không chỉ sử dụng đa xử lý? Theo như tôi có thể nói từ mô tả của bạn, luồng sẽ không giúp bạn nhiều, dù sao ...

Matplotlib đã là chủ đề để bạn có thể hiển thị và tương tác với nhiều hình cùng một lúc. Nếu bạn muốn tăng tốc độ xử lý hàng loạt trên một máy đa lõi, bạn sẽ cần đa xử lý bất kể.

Như một ví dụ cơ bản (Cảnh báo: Điều này sẽ tạo ra 20 file .png nhỏ trong bất cứ thư mục bạn chạy nó trong!)

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

Ngoài phiên bản 'đa xử lý 'siêu nhanh so với phiên bản' luồng' – jfs

Các vấn đề liên quan