Tôi sẽ không gọi concurrent.futures
"nâng cao" hơn - đó là một giao diện đơn giản hoạt động rất giống nhau bất kể bạn sử dụng nhiều luồng hay nhiều tiến trình như là mánh lới quảng cáo song song cơ bản.
Vì vậy, giống như hầu hết tất cả các trường hợp của "giao diện đơn giản hơn", có rất nhiều sự đánh đổi tương tự: nó có đường cong học tập nông hơn, phần lớn chỉ vì có rất ít thứ để học; nhưng, vì nó cung cấp ít tùy chọn hơn, cuối cùng nó có thể làm bạn thất vọng theo cách mà các giao diện phong phú hơn sẽ không.
Theo như các nhiệm vụ liên quan đến CPU, thì đó là cách quá ít để nói có ý nghĩa nhiều. Đối với các tác vụ gắn với CPU trong CPython, bạn cần nhiều quy trình thay vì nhiều luồng để có bất kỳ cơ hội nào để tăng tốc. Nhưng mức độ tăng tốc (nếu có) của bạn tăng bao nhiêu tùy thuộc vào chi tiết về phần cứng, hệ điều hành của bạn và đặc biệt là mức độ liên lạc giữa các quá trình mà các tác vụ cụ thể của bạn yêu cầu. Trong vỏ bọc, tất cả các mánh lới song song hóa giữa các quá trình đều dựa trên cùng các nguyên hàm HĐH - API cấp cao mà bạn sử dụng để có được những yếu tố không phải là yếu tố chính trong tốc độ dòng dưới cùng.
Chỉnh sửa: ví dụ
Đây là mã cuối cùng được hiển thị trong bài viết mà bạn đã tham chiếu, nhưng tôi đang thêm một câu lệnh nhập cần thiết để làm cho nó hoạt động:
from concurrent.futures import ProcessPoolExecutor
def pool_factorizer_map(nums, nprocs):
# Let the executor divide the work among processes by using 'map'.
with ProcessPoolExecutor(max_workers=nprocs) as executor:
return {num:factors for num, factors in
zip(nums,
executor.map(factorize_naive, nums))}
Đây chính xác là điều tương tự bằng cách sử dụng multiprocessing
thay thế:
import multiprocessing as mp
def mp_factorizer_map(nums, nprocs):
with mp.Pool(nprocs) as pool:
return {num:factors for num, factors in
zip(nums,
pool.map(factorize_naive, nums))}
Lưu ý rằng khả năng sử dụng multiprocessing.Pool
các đối tượng làm trình quản lý bối cảnh đã được thêm vào Python 3.3.
Cái nào dễ làm việc hơn? LOL ;-) Về cơ bản chúng giống hệt nhau.
Một điểm khác biệt là nó Pool
hỗ trợ rất nhiều cách làm việc khác nhau mà bạn có thể không nhận ra nó có thể dễ dàng như thế nào cho đến khi bạn leo lên một cách hoàn toàn trên đường cong học tập.
Một lần nữa, tất cả những cách khác nhau vừa là điểm mạnh vừa là điểm yếu. Chúng là một thế mạnh bởi vì sự linh hoạt có thể được yêu cầu trong một số tình huống. Chúng là một điểm yếu vì "tốt nhất chỉ có một cách rõ ràng để làm điều đó". Một dự án gắn bó riêng (nếu có thể) concurrent.futures
có thể sẽ dễ dàng duy trì hơn trong thời gian dài, do thiếu tính mới lạ vô cớ trong cách sử dụng API tối thiểu của nó.