Giả sử tôi có một mảng lớn trong bộ nhớ, tôi có một hàm func
nhận mảng khổng lồ này làm đầu vào (cùng với một số tham số khác). func
với các thông số khác nhau có thể được chạy song song. Ví dụ:
def func(arr, param):
# do stuff to arr, param
# build array arr
pool = Pool(processes = 6)
results = [pool.apply_async(func, [arr, param]) for param in all_params]
output = [res.get() for res in results]
Nếu tôi sử dụng thư viện đa xử lý, thì mảng khổng lồ đó sẽ được sao chép nhiều lần vào các quy trình khác nhau.
Có cách nào để cho phép các quy trình khác nhau chia sẻ cùng một mảng không? Đối tượng mảng này là chỉ đọc và sẽ không bao giờ được sửa đổi.
Có gì phức tạp hơn, nếu arr không phải là một mảng mà là một đối tượng python tùy ý, có cách nào để chia sẻ nó không?
[ĐÃ CHỈNH SỬA]
Tôi đọc câu trả lời nhưng tôi vẫn còn một chút bối rối. Vì fork () là copy-on-write, chúng tôi không nên gọi thêm bất kỳ chi phí nào khi tạo các quy trình mới trong thư viện đa xử lý python. Nhưng đoạn mã sau cho thấy có một chi phí lớn:
from multiprocessing import Pool, Manager
import numpy as np;
import time
def f(arr):
return len(arr)
t = time.time()
arr = np.arange(10000000)
print "construct array = ", time.time() - t;
pool = Pool(processes = 6)
t = time.time()
res = pool.apply_async(f, [arr,])
res.get()
print "multiprocessing overhead = ", time.time() - t;
đầu ra (và nhân tiện, chi phí tăng lên khi kích thước của mảng tăng lên, vì vậy tôi nghi ngờ vẫn còn chi phí liên quan đến sao chép bộ nhớ):
construct array = 0.0178790092468
multiprocessing overhead = 0.252444982529
Tại sao lại có chi phí lớn như vậy, nếu chúng ta không sao chép mảng? Và bộ nhớ dùng chung giúp tôi lưu lại phần nào?