2016-07-08 12 views
15

Tôi đang sử dụng 'multiprocess.Pool.imap_unordered' như sauKhi nào chúng ta nên gọi đa xử lý.Pool.join?

from multiprocessing import Pool 
pool = Pool() 
for mapped_result in pool.imap_unordered(mapping_func, args_iter): 
    do some additional processing on mapped_result 

Tôi có cần phải gọi pool.close hay pool.join sau khi cho vòng lặp?

+0

Tôi thường gọi 'pool.join()' sau đó 'pool.close()' khi tôi đã bắt đầu tất cả các chủ đề của nhóm, nhưng tôi đã không thử sử dụng 'pool.imap_unordered()' làm một lần lặp. – Bamcclur

+0

điểm gọi điện thoại tham gia hoặc đóng là gì? Tôi không gọi cho họ và mã của tôi có vẻ hoạt động tốt. Tuy nhiên, tôi lo ngại rằng không gọi những người đó sẽ dẫn đến quá trình zombie hoặc những thứ tinh tế khác. –

Trả lời

26

Không, bạn không, nhưng có thể là một ý kiến ​​hay nếu bạn không sử dụng hồ bơi nữa.

lý do để gọi pool.close hay pool.join đang nói cũng bởi Tim Peters trong this SO post:

Đối với Pool.close(), bạn nên gọi đó là khi - và chỉ khi - bạn sẽ không bao giờ phải nộp làm việc nhiều hơn cho cá thể của Pool. Vì vậy, Pool.close() thường được gọi khi phần song song của chương trình chính của bạn được hoàn thành. Sau đó, các quy trình công nhân sẽ chấm dứt khi tất cả công việc đã được giao đã hoàn thành.

Thực tiễn tuyệt vời là gọi Pool.join() để chờ các quy trình của nhân viên chấm dứt. Trong số các lý do khác, thường không có cách nào tốt để báo cáo ngoại lệ trong mã song song (ngoại lệ xảy ra trong ngữ cảnh chỉ liên quan đến những gì chương trình chính của bạn đang làm), và Pool.join() cung cấp một điểm đồng bộ có thể báo cáo một số ngoại lệ trong các quy trình công nhân mà bạn sẽ không bao giờ thấy.

+3

có tốt hơn khi gọi cho người kia trước người kia không? – RSHAP

+2

Có vẻ như mọi người muốn gọi 'pool.close()' trước tiên và 'pool.join()' giây. Điều này cho phép bạn thêm công việc giữa 'pool.close()' và 'pool.join()' mà không cần đợi hồ bơi hoàn thành việc thực thi. – Bamcclur

+0

Chỉ cần thêm vào nhận xét của @ Bamcclur - nó không chỉ là một ý tưởng hay để gọi 'pool.close()' trước tiên, nó thực sự là bắt buộc. Từ [tài liệu] (https://docs.python.org/2/library/multiprocessing.html#module-multiprocessing.pool): Người ta phải gọi 'close()' hoặc 'terminate()' trước khi sử dụng ' join() '. – Bogd

3

Tôi gặp vấn đề về bộ nhớ giống như Memory usage keep growing with Python's multiprocessing.pool khi tôi không sử dụng pool.close() và pool.join() khi sử dụng pool.map() với hàm tính khoảng cách Levenshtein. Chức năng này hoạt động tốt, nhưng không phải là rác được thu thập đúng cách trên máy Win7 64, và việc sử dụng bộ nhớ không ngừng kiểm soát mỗi khi chức năng được gọi cho đến khi nó mất toàn bộ hệ điều hành. Đây là mã cố định rò rỉ:

stringList = [] 
for possible_string in stringArray: 
    stringList.append((searchString,possible_string)) 

pool = Pool(5) 
results = pool.map(myLevenshteinFunction, stringList) 
pool.close() 
pool.join() 

Sau khi đóng và tham gia vào hồ bơi, rò rỉ bộ nhớ biến mất.

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