[英]How can I make many perallel processes make changes to a single shared NumPy array?
我在互聯網上搜尋答案,但找不到任何適合我的情況。 我讀過有關multiprocessing.Manager
,嘗試過來回傳遞東西,但似乎都無法與NumPy數組一起使用。我嘗試使用Pool
代替,但是我的目標方法沒有返回任何東西,它只是對數組,所以我不確定如何設置它。
現在我有:
def Multiprocess(self, sigmaI, sigmaX):
cpus = mp.cpu_count()
print('Number of cpu\'s to process WM: %d' % cpus)
processes = [mp.Process(target = self.CreateMatrixMp, args = (sigmaI, sigmaX, i,)) for i in range(self.numPixels)]
for p in processes:
p.start()
for p in processes:
p.join()
目標函數CreateMatrixMp
接受傳遞的值,並在進行計算后將值附加到數組data
。 此數組聲明為self.data = numpy.zeros(self.size, numpy.float64)
。 如果CreateMatrixMp
方法的詳細信息有幫助,我也可以發布它。
我嘗試在運行過程的上方添加以下內容:
mgr = mp.Manager()
sharedData = mgr.Array(ctypes.c_numpy.float64, self.data)
然后將sharedData
傳遞到CreateMatrixMp
,在這里可以對其進行修改。 一旦所有進程都運行並且數組完成,我就簡單地執行self.data = sharedData
。
但這是行不通的(盡管我知道我沒有正確設置它)。 如何使用NumPy數組完成此操作? 我希望每個進程(將有成千上萬個)附加到同一數組。
任何幫助深表感謝。
歡迎來到多線程的黑暗世界。 我認為您的最大問題是mgr.Array圍繞數組進行同步。 如果您快速生成數據,這將成為瓶頸,因為進程將等待最后一個數組完成。 如果每個進程都保留該nump數組的私有副本,它將更加高效,並且將有所幫助。 輸入所有數據后,請等待所有過程完成。 然后,您可以將所有數組組合到self.data中。 這樣,所有已處理的資源都無需等待共享資源。 此解決方案或您的解決方案都不能保證輸出列表的順序。 我從self.numPixels懷疑順序可能很重要。 解決方案很多,但最簡單的方法是按順序輸入數據並在完成后執行self.data.sort(...)。 另一種方法是,更快地預先創建self.data並使進程在正確的位置戳結果。 self.data不必是共享的數據結構,因為進程永遠不會改變任何共同點。 如果數組映射到類似C的數組,這將起作用。 它不適用於鏈接列表等。希望這會有所幫助。 詢問是否需要更多詳細信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.