2013-09-26 202 views
12

Tôi đang cố gắng sử dụng gói multiprocessing cho Python. Khi xem hướng dẫn, kỹ thuật rõ ràng và đơn giản nhất có vẻ là sử dụng pool.map, cho phép người dùng dễ dàng đặt tên cho số lượng quy trình và chuyển pool.map một hàm và danh sách các giá trị cho hàm đó để phân phối trên các CPU. Kỹ thuật khác mà tôi đã gặp phải là using queues để quản lý một nhóm công nhân. answer có một công việc tuyệt vời giải thích sự khác biệt giữa pool.map, pool.applypool.apply_async, nhưng lợi thế và bất lợi của việc sử dụng pool.map so với sử dụng hàng đợi như thế nào trong số example này?Xử lý đa nhân Python: pool.map và sử dụng hàng đợi

Trả lời

9

Kỹ thuật pool.map là "tập con" của kỹ thuật có hàng đợi. Tức là, nếu không có pool.map, bạn có thể dễ dàng triển khai nó bằng cách sử dụng PoolQueue. Điều đó nói rằng, việc sử dụng hàng đợi cho phép bạn linh hoạt hơn trong việc kiểm soát các quy trình hồ bơi của mình, tức là bạn có thể tạo các loại thư cụ thể chỉ đọc một lần trong suốt thời gian của quy trình, kiểm soát hành vi tắt máy của quá trình bơi, v.v.

+0

Liệu 'pool.map' có tự động tắt các quy trình khi hoàn tất không? – Michael

+1

Từ tài liệu: '' Khi đối tượng hồ bơi là rác thu thập chấm dứt() sẽ được gọi ngay lập tức.''. Nhưng tôi sẽ không dựa vào nó - nó sẽ tốt hơn nếu bạn đã đảm bảo hồ bơi đã đóng cửa ở phần cuối của ứng dụng của bạn. Nếu không, bạn có thể kết thúc với một số zombie còn lại trong hệ thống của bạn. Đối với 'pool.map' - không, nó không tắt các tiến trình. Các quy trình sống miễn là hồ bơi của họ trừ khi bị đóng cửa hoặc mồ côi. –

4

Nếu bạn đang thực sự tìm kiếm "kỹ thuật rõ ràng nhất và đơn giản nhất", sử dụng concurrent.futures.ProcessPoolExecutor có lẽ là cách dễ nhất. Nó có một phương pháp map cũng như một số nguyên thủy khác mà làm cho nó rất hữu dụng. Nó cũng tương thích với Queue s.

+0

thư viện rất dễ dàng và trực quan. – Jaydev