2013-05-18 59 views

回答

2

最簡單我知道的方式是使用multiprocessing.Pool.map就像你會使用map內建。你只需要編寫一個函數來做到這一點,你要完成的任務,它處理所有的並行:

import multiprocessing as mp 

instances = [ClassName() for i in range(no_inst)] 

def dosomething(inst): 
    for data in dataset: 
     inst.dosomething(data) 

num_procs = 4 #however many processors you'll use 
pool = mp.Pool(num_procs) 
pool.map(dosomething,instances) 

有幾個陷阱 - 因爲他們不是lambda功能將無法在這裏工作例如pickleable。這也返回一個列表None(因爲這是什麼dosomething返回) - 通常我不喜歡使用列表解析或map的副作用,但我放鬆我的立場,因爲它涉及到多處理,因爲它是那麼容易

+0

爲了使'dataset'對子進程可用,你可以使用Pool的'initializer'參數。如果'inst.dosomething()'內部的操作釋放GIL,則可以使用'ThreadPool'。 – jfs

+0

@ J.F.Sebastian - 也許這是總是使用'fork'在* NIX系統上工作的結果,但我從來沒有這樣做過。 ''dataset''總是像封閉函數一樣從閉包中獲取。它在Windows上的行爲有所不同嗎? – mgilson

+0

yes(在Windows上沒有'fork'和相關的「copy-on-write」),你還需要'if __name__ ==「__main __」'來保護池的創建 – jfs

0

您可以使用接口threading創建一個Thread類,該類滿足dosomething(data)。您可以爲每個循環啓動多個線程,調用run()來啓動它們。建議將它們放入一個列表中,以便您可以檢查它們的狀態,直到完成所有狀態。

+0

在CPython上,它會運行到GIL並且不會比串行處理更快。 –

+0

@ IgnacioVazquez-Abrams:不一定正確。即使使用GIL,多線程程序也可能比單線程程序快得多。 I/O限制的工作量很常見。 – Cairnarvon

+0

在某些情況下,與串行實現(甚至在Cpython上)相比,線程加速更快。但是,這些情況並不常見。 – mgilson

相關問題