Tôi đã triển khai thư viện đa xử lý python bằng cách sử dụng một nhóm công nhân. Tôi đã triển khai mã sau đâyXử lý đa nhân Python dẫn đến nhiều quy trình zombie
import main1
t1 = time.time()
p = Pool(cores)
result = p.map(main1, client_list[client])
if result == []:
return []
p.close()
p.join()
print "Time taken in performing request:: ", time.time()-t1
return shorted(result)
Tuy nhiên, sau khi chạy quá trình này, tôi nhận được nhiều quá trình chạy nền của ứng dụng. Đây là một ảnh chụp sau khi làm ps aux cho ứng dụng của tôi
Bây giờ, tôi đã đọc rất nhiều câu hỏi tương tự trên stackoverflow như how to kill zombie processes created by multiprocessing module? mà đòi hỏi phải sử dụng .join() mà tôi đã thực hiện và tôi đã học làm thế nào để tiêu diệt tất cả các quy trình này từ đây Python Multiprocessing Kill Processes. Nhưng tôi muốn biết điều gì có thể sai với mã của tôi. Tôi sẽ không thể chia sẻ tất cả mã của mình trong hàm main1 nhưng tôi đã đặt toàn bộ khối mã vào thử khối catch để tránh trường hợp lỗi trong mã chính có thể dẫn đến các quá trình zombie.
def main1((param1, param2, param3)):
try:
resout.append(some_data) //resout in case of no error
except:
print traceback.format_exc()
resout = [] //sending empty resout in case of error
return resout
Tôi vẫn còn rất mới với khái niệm lập trình song song và các vấn đề gỡ lỗi với nó đang trở nên khó khăn. Mọi trợ giúp sẽ được đánh giá cao.
Thật không may mã bạn đăng không giúp gì nhiều trong việc chẩn đoán sự cố. Quá nhiều biến không giải thích được, và quan trọng hơn, nó không rõ ràng từ những gì bạn đăng cách mã được gọi, và những gì đang xảy ra sau khi hàm của bạn trả về. Ấn tượng ban đầu của tôi là bạn đang tạo ra nhiều hồ bơi trong một vòng lặp, thay vì tái sử dụng một hồ bơi nhiều lần. Nhưng tôi không thể chắc chắn. – justinpawela
[Bạn nên cấu trúc mã của bạn như thế này.] (Http://pymotw.com/2/multiprocessing/communication.html#process-pools) Nếu bạn có nhiều việc phải làm, bạn nên sử dụng cùng một hồ bơi hơn và hơn (bạn chỉ nên gọi 'Pool()' một lần). Khi bạn cuối cùng đã được thực hiện với các quy trình công nhân, việc gọi 'close' và' join' là quan trọng - chúng là những gì báo hiệu các quá trình chấm dứt; chúng không chỉ để tiêu diệt zombie. Trong khối mã đầu tiên của bạn ở trên, nếu 'kết quả' trống, bạn không bao giờ chấm dứt các công nhân, bạn chỉ' trả về' cho bất kỳ mã nào là người gọi. – justinpawela