簡體   English   中英

如何並行化對象數組上的方法調用?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM