2015-05-28 32 views
6

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

Snapshot showing all the zombie processes

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.

+0

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

+0

[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

Trả lời

10

Thông thường, vấn đề phổ biến nhất là hồ bơi được tạo nhưng không được đóng.

Cách tốt nhất mà tôi biết để đảm bảo rằng các hồ bơi được đóng là sử dụng một thử/cuối cùng khoản:

try: 
    pool = Pool(ncores) 
    pool.map(yourfunction, arguments) 
finally: 
    pool.close() 
    pool.join() 

Nếu bạn không muốn vật lộn với multiprocessing, tôi đã viết một gói đơn giản đặt tên parmap kết thúc tốt quá trình đa xử lý để làm cho cuộc sống của tôi (và tiềm năng của bạn) dễ dàng hơn.

pip install parmap

import parmap 
parmap.map(yourfunction, arguments) 

Từ phần sử dụng parmap:

  • Ví dụ đơn giản song song:

    import parmap 
    y1 = [myfunction(x, argument1, argument2) for x in mylist] 
    y2 = parmap.map(myfunction, mylist, argument1, argument2) 
    y1 == y2 
    
  • iterating trên một danh sách các hàng:

    # You want to do: 
    z = [myfunction(x, y, argument1, argument2) for (x,y) in mylist] 
    z = parmap.starmap(myfunction, mylist, argument1, argument2) 
    
    
    # You want to do: 
    listx = [1, 2, 3, 4, 5, 6] 
    listy = [2, 3, 4, 5, 6, 7] 
    param = 3.14 
    param2 = 42 
    listz = [] 
    for (x, y) in zip(listx, listy): 
        listz.append(myfunction(x, y, param1, param2)) 
    # In parallel: 
    listz = parmap.starmap(myfunction, zip(listx, listy), param1, param2) 
    
+0

Điều này thực sự rất thuận tiện cho các nhà phát triển không muốn đối phó với mớ hỗn độn liên quan đến xử lý đa. – ankits

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