在多重處理中維護共享唯讀資料
問題:
問題:
答案:
<code class="python">import multiprocessing import ctypes import numpy as np shared_array_base = multiprocessing.Array(ctypes.c_double, 10*10) shared_array = np.ctypeslib.as_array(shared_array_base.get_obj()) shared_array = shared_array.reshape(10, 10)</code>
利用由多處理模組與 NumPy 結合使用,可以在進程之間高效共享資料。
<code class="python"># Parallel processing def my_func(i, def_param=shared_array): shared_array[i,:] = i if __name__ == '__main__': pool = multiprocessing.Pool(processes=4) pool.map(my_func, range(10)) print(shared_array)</code>
這種方法利用了 Linux 對 fork() 採用寫入時複製語義的事實,確保僅在以下情況下才複製資料:修改的。因此,即使沒有明確使用 multiprocessing.Array,資料也會在進程之間有效共享,除非發生變更。
[[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.] [ 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.] [ 2. 2. 2. 2. 2. 2. 2. 2. 2. 2.] [ 3. 3. 3. 3. 3. 3. 3. 3. 3. 3.] [ 4. 4. 4. 4. 4. 4. 4. 4. 4. 4.] [ 5. 5. 5. 5. 5. 5. 5. 5. 5. 5.] [ 6. 6. 6. 6. 6. 6. 6. 6. 6. 6.] [ 7. 7. 7. 7. 7. 7. 7. 7. 7. 7.] [ 8. 8. 8. 8. 8. 8. 8. 8. 8. 8.] [ 9. 9. 9. 9. 9. 9. 9. 9. 9. 9.]]
此程式碼同時修改共享陣列並示範了在多個進程之間成功共享資料:
透過利用共享記憶體和寫入時複製語義,此方法提供了一種有效的解決方案,用於在多處理環境中的進程之間共享大量唯讀資料。以上是如何在 Python 多重處理中高效共享大型唯讀資料?的詳細內容。更多資訊請關注PHP中文網其他相關文章!