2009-09-12 51 views
6

Tôi đang cố gắng chạy cProfile.runctx() trên mỗi quy trình trong một nhóm đa xử lý, để biết ý nghĩa của các nút thắt đa xử lý trong nguồn của tôi. Dưới đây là một ví dụ đơn giản về những gì tôi đang cố gắng để làm:Lập hồ sơ đa xử lý python

from multiprocessing import Pool 
import cProfile 

def square(i): 
    return i*i 

def square_wrapper(i): 
    cProfile.runctx("result = square(i)", 
     globals(), locals(), "file_"+str(i)) 
    # NameError happens here - 'result' is not defined. 
    return result 

if __name__ == "__main__": 
    pool = Pool(8) 
    results = pool.map_async(square_wrapper, range(15)).get(99999) 
    print results 

Thật không may, cố gắng thực hiện "result = vuông (i)" trong hồ sơ không ảnh hưởng đến 'kết quả' trong phạm vi nó được gọi là từ . Làm thế nào tôi có thể hoàn thành những gì tôi đang cố gắng làm ở đây?

Trả lời

6

Hãy thử điều này:

def square_wrapper(i): 
    result = [None] 
    cProfile.runctx("result[0] = square(i)", globals(), locals(), "file_%d" % i) 
    return result[0] 
+2

+1; đã làm việc, nhưng có vẻ khá hacky. Bạn có thể giải thích lý do tại sao nó hoạt động không? – Fragsworth

+1

Tôi đoán 'result = square (i)' vừa tạo một tham chiếu mới, trong phạm vi cProfile.runctx (hoặc bất cứ nơi nào nó thực thi mã), để nguyên nguyên cũ. Sử dụng "kết quả toàn cục" trước runctx và "kết quả chung, kết quả = hình vuông (i)" (hoặc "globals() ['result'] = square (i)") bên trong các công trình. –

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