multiprocessing fork () so với spawn ()

Sep 28 2020

Tôi đang đọc mô tả của cả hai từ tài liệu python :

đẻ trứng

Quy trình mẹ bắt đầu một quy trình thông dịch python mới. Tiến trình con sẽ chỉ kế thừa những tài nguyên cần thiết để chạy phương thức run () của đối tượng tiến trình. Đặc biệt, các bộ mô tả và xử lý tệp không cần thiết từ tiến trình mẹ sẽ không được kế thừa. Bắt đầu một quy trình bằng phương pháp này khá chậm so với việc sử dụng fork hoặc forkerver. [Có sẵn trên Unix và Windows. Mặc định trên Windows và macOS.]

cái nĩa

Tiến trình mẹ sử dụng os.fork () để phân nhánh trình thông dịch Python. Quá trình con, khi nó bắt đầu, giống hệt với quá trình mẹ. Tất cả tài nguyên của cha mẹ được kế thừa bởi tiến trình con. Lưu ý rằng quá trình phân luồng đa luồng một cách an toàn là một vấn đề. [Chỉ có sẵn trên Unix. Mặc định trên Unix.]

Và câu hỏi của tôi là:

  1. Có phải là đợt fork diễn ra nhanh hơn nhiều vì nó không cố gắng xác định tài nguyên nào để sao chép?
  2. Có phải vì fork trùng lặp mọi thứ, nó sẽ "lãng phí" nhiều tài nguyên hơn so với spawn ()?

Trả lời

3 Darkonaut Sep 28 2020 at 12:25
  1. Có phải là đợt fork diễn ra nhanh hơn nhiều vì nó không cố gắng xác định tài nguyên nào để sao chép?

Có, nó nhanh hơn nhiều. Các hạt nhân có thể sao chép toàn bộ quá trình và chỉ bản sửa đổi bộ nhớ trang như một toàn thể . Việc chuyển nguồn tài nguyên sang một quy trình mới và khởi động trình thông dịch từ đầu là không cần thiết.

  1. Có phải vì fork trùng lặp mọi thứ, nó sẽ "lãng phí" nhiều tài nguyên hơn so với spawn ()?

Fork trên các hạt nhân hiện đại chỉ thực hiện "copy-on-write" và nó chỉ ảnh hưởng đến các trang bộ nhớ thực sự thay đổi. Lưu ý là "write" đã chỉ bao gồm việc lặp lại một đối tượng trong CPython. Đó là bởi vì số tham chiếu cho đối tượng được tăng lên.

Nếu bạn có các quy trình đang chạy dài với nhiều đối tượng nhỏ được sử dụng, điều này có thể có nghĩa là bạn lãng phí nhiều bộ nhớ hơn so với sinh sản. Thông thường, tôi nhớ lại Facebook đã tuyên bố rằng việc sử dụng bộ nhớ đã giảm đáng kể khi chuyển từ "fork" sang "spawn" cho các quy trình Python của họ.