instances = [ClassName() for i in range(no_inst)]
for data in dataset:
for inst in instances:
inst.dosomething(data)
注:情況不修改數據,因此沒有必要實例之間的通信。
instances = [ClassName() for i in range(no_inst)]
for data in dataset:
for inst in instances:
inst.dosomething(data)
注:情況不修改數據,因此沒有必要實例之間的通信。
該最簡單我知道的方式是使用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
的副作用,但我放鬆我的立場,因爲它涉及到多處理,因爲它是那麼容易。
爲了使'dataset'對子進程可用,你可以使用Pool的'initializer'參數。如果'inst.dosomething()'內部的操作釋放GIL,則可以使用'ThreadPool'。 – jfs
@ J.F.Sebastian - 也許這是總是使用'fork'在* NIX系統上工作的結果,但我從來沒有這樣做過。 ''dataset''總是像封閉函數一樣從閉包中獲取。它在Windows上的行爲有所不同嗎? – mgilson
yes(在Windows上沒有'fork'和相關的「copy-on-write」),你還需要'if __name__ ==「__main __」'來保護池的創建 – jfs
您可以使用接口threading
創建一個Thread
類,該類滿足dosomething(data)
。您可以爲每個循環啓動多個線程,調用run()
來啓動它們。建議將它們放入一個列表中,以便您可以檢查它們的狀態,直到完成所有狀態。
在CPython上,它會運行到GIL並且不會比串行處理更快。 –
@ IgnacioVazquez-Abrams:不一定正確。即使使用GIL,多線程程序也可能比單線程程序快得多。 I/O限制的工作量很常見。 – Cairnarvon
在某些情況下,與串行實現(甚至在Cpython上)相比,線程加速更快。但是,這些情況並不常見。 – mgilson
「multiprocessing」文檔的哪個部分有問題? –