[英]How can I parallelize method calls on an array of objects?
我有一個包含對象列表的模擬。 我想使用線程池在所有這些對象上並行調用一個方法,因為它們都不依賴於另一個。 您不能腌制方法,因此我正在考慮使用具有副作用的包裝器功能來執行以下操作:
from multiprocessing import Pool
class subcl:
def __init__(self):
self.counter=1
return
def increment(self):
self.counter+=1
return
def wrapper(targ):
targ.increment()
return
class sim:
def __init__(self):
self.world=[subcl(),subcl(),subcl(),subcl()]
def run(self):
if __name__=='__main__':
p=Pool()
p.map(wrapper,self.world)
a=sim()
a.run()
print a.world[1].counter #should be 2
但是,函數調用對數組中的實際對象沒有預期的副作用。 有沒有一種方法可以通過線程池和映射來簡單地處理此問題,還是我必須按照原始函數調用和元組/列表/字典進行所有操作(或者對多處理或其他並行庫進行更詳細的說明)?
造成混亂的主要原因是, multiprocessing
使用單獨的進程而不是線程。 這意味着,子級對對象狀態所做的任何更改都不會自動顯示給父級。
在您的示例中,處理此問題的最簡單方法是讓wrapper
返回新值,然后使用Pool.map
的返回值:
from multiprocessing import Pool
class subcl:
def __init__(self):
self.counter=1
return
def increment(self):
self.counter+=1
return
def wrapper(targ):
targ.increment()
return targ # <<<<< change #1
class sim:
def __init__(self):
self.world=[subcl(),subcl(),subcl(),subcl()]
def run(self):
if __name__=='__main__':
p=Pool()
self.world = p.map(wrapper,self.world) # <<<<< change #2
a=sim()
a.run()
print a.world[1].counter # now prints 2
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.