2010-02-16 35 views

Trả lời

13

Trên nền tảng Posix, multiprocessing nguyên thủy cơ bản quấn một số os.fork(). Điều này có nghĩa là tại thời điểm bạn sinh ra một quá trình trong đa xử lý, mã đã được nhập/khởi tạo vẫn như vậy trong tiến trình con. Điều này có thể là một lợi ích nếu bạn có rất nhiều thứ để khởi tạo và sau đó mỗi tiến trình con về cơ bản thực hiện các hoạt động trên (bản sao) các đối tượng khởi tạo, nhưng không phải tất cả những gì hữu ích nếu điều bạn chạy trong tiến trình con hoàn toàn không liên quan .

Ngoài ra còn có ý nghĩa đối với các tài nguyên như xử lý tệp, ổ cắm, v.v ... với multiprocessing trên nền tảng giống như Unix.

Khi đó, khi sử dụng subprocess, bạn sẽ tạo chương trình/phiên dịch hoàn toàn mới mỗi lần bạn Popen quy trình mới. Điều này có nghĩa là có thể có ít bộ nhớ được chia sẻ hơn giữa chúng, nhưng nó cũng có nghĩa là bạn có thể Popen thành một chương trình hoàn toàn riêng biệt, hoặc một điểm vào mới vào cùng một chương trình.

Trên Windows, sự khác biệt ít hơn giữa multiprocessingsubprocess, vì cửa sổ không cung cấp fork().

+0

điểm tốt ... cảm ơn! – jldupont

+1

Microsoft cung cấp 'fork()' trong các phiên bản cao cấp của Windows. Xem [answer] của tôi (http://stackoverflow.com/a/5372260/95735) để biết chi tiết. –

+0

@PiotrDobrogost Nhưng tôi không tin rằng "đa xử lý" trên cửa sổ tận dụng điều này. – Crast

3

Nếu bạn bỏ qua bất kỳ sự cố liên lạc nào (tức là nếu các máy ảo Python riêng biệt không giao tiếp với nhau hoặc chỉ giao tiếp thông qua các cơ chế khác được thiết lập rõ ràng) thì không có sự khác biệt đáng kể nào khác. (Tôi tin rằng multiprocessing, trong những điều kiện nhất định - nền tảng giống Unix, đặc biệt - có thể sử dụng hiệu quả hơn fork thay vì cặp fork-exec luôn ngụ ý bởi multiprocessing - nhưng đó không phải là "đáng kể" khi chỉ một vài quy trình tham gia [[IOW, sự khác biệt hiệu suất khi khởi động sẽ không phải là tài liệu cho hiệu suất của toàn bộ hệ thống]]).

+0

Cảm ơn Alex lần nữa! – jldupont

Các vấn đề liên quan