2013-08-30 54 views
2

我是Python中的多處理新手。我有一個簡單的程序,如:在Python中並行運行2+不同的獨立類方法

class test: 
    ... 
    def func(): 
     return something 

inst1 = test(init1, ...) 
inst2 = test(init2, ...) 
inst3 = test(init3, ...) 

x = [] 
while(some_condition): 
    a = inst1.func() 
    b = inst2.func() 
    c = inst3.func() 
    x.append(do_something(a, b, c)) 

隨着func CPU密集型和每次調用時返回一個不同的值。

我有一臺帶有2個8核CPU的機器,安裝了Ubuntu和Python 2.6.5(不能更新,不幸),另一臺機器只有一個i7處理器和Python 2.7.5(也不能更新)。我也無法安裝新的軟件包。

我相信如果所有3種方法同時運行(理論上操作系統應該將它們分配給不同內核),我可以獲得一些性能,但我不知道如何繼續。該文檔對於多處理來說至多是神祕的。

請問我可以給我一些例子,或給我一些關於如何做到這一點的建議嗎?由於

回答

0

嗯,這與文檔中的其中一個示例非常接近......但我認爲使用Pool比使用顯式進程更容易,使用Futures比使用簡單池更容易。另外,futures模塊的文檔比multiprocessing文檔簡單得多。所以,讓我們這樣做的:

x = [] 
with concurrent.futures.ProcessPoolExecutor(max_workers=3) as executor: 
    while some_condition: 
     a = executor.submit(func1) 
     b = executor.submit(func2) 
     c = executor.submit(func3) 
     concurrent.futures.wait((a, b, c)) 
     x.append(do_something(a.result(), b.result(), c.result())) 

如果你使用的是Python 2.5-3.1,你會不會在這個STDLIB模塊,所以你需要安裝the backport


爲了便於比較,這裏是它會是什麼樣子使用每個功能的明確multiprocessing.Process

def background(f): 
    q = multiprocessing.Queue() 
    def wrapped(q): 
     q.put(f()) 
    p = multiprocess.Process(target=wrapped, args=q) 
    p.start() 
    return p, q 

x = [] 
while some_condition: 
    pa, qa = background(func1) 
    pb, qb = background(func2) 
    pc, qc = background(func3) 
    pa.join() 
    pb.join() 
    pc.join() 
    x.append(do_something(qa.get(), qb.get(), qc.get()) 
+0

您的解決方案工程確定的功能,但我的意思是方法,我很抱歉。 – user2329994

+0

@ user2329994:基本的東西適用於方法。一個像'inst.func'這樣的綁定方法是一個可以傳遞並調用的值,就像函數一樣。您可能會遇到酸洗問題,但這些問題通常很容易解決 - 無論如何,當您來到時,您可以穿過那座橋。 – abarnert