2012-08-16 26 views
8

Tôi đang bắt đầu một loạt các luồng khác nhau trong tập lệnh Python của mình. Tôi muốn theo dõi việc sử dụng bộ nhớ và CPU của từng chủ đề này. Tôi sử dụng topps -eLf cho điều đó.ID của một chuỗi Python được báo cáo bởi đầu trang

Nhưng hóa ra số nhận dạng được trả về bởi thread.start_new_thread() khác với chuỗi PID được hiển thị bởi top và các chương trình tương tự khác. Có cách nào để lấy PID này từ trong Python script không? Bằng cách này, tôi có thể xác định PID nào thuộc về chuỗi nào.

+1

Thay vì phân tích cú pháp hàng đầu, bạn có thể tìm hiểu/proc/main_PID/nhiệm vụ và nhận danh sách các chủ đề con và cách sử dụng bộ nhớ của chúng. –

+0

@ ers81239 Cảm ơn! Nhưng chính xác thì tôi nên tìm gì ở đây. Tất cả các thư mục trong đó trông rất giống nhau. Tôi muốn tương quan mà tid thuộc về chủ đề mà là một trong những chủ đề được sử dụng rất nhiều CPU. – Phani

Trả lời

12

Nhờ vào điều này post, tôi đã nhận các chuỗi Python để báo cáo ID luồng tương ứng của chúng. Trước tiên, hãy làm một số grep -r 'SYS_gettid' /usr/include/'. Tôi có một dòng: #define SYS_gettid __NR_gettid Khi grepping hơn nữa bằng cách grep -r '__NR_gettid' /usr/include/, tôi nhận được một loạt các dòng phù hợp:

/usr/include/x86_64-linux-gnu/asm/unistd_32.h:#define __NR_gettid 224 
/usr/include/x86_64-linux-gnu/asm/unistd_64.h:#define __NR_gettid 186 
/usr/include/asm-generic/unistd.h:#define __NR_gettid 178 

Bây giờ chọn một trong đó phù hợp với kiến ​​trúc của bạn. Mine là 186. Bây giờ bao gồm mã này trong tất cả Python script thread của bạn để có được những thread ID như được thấy bởi hệ điều hành:

import ctypes 
tid = ctypes.CDLL('libc.so.6').syscall(186) 
0

Bạn đang sử dụng hệ điều hành nào?

Ngoại trừ các phiên bản Linux cũ, mỗi luồng phải có cùng một PID (ID tiến trình). Mã định danh trên thread.start_new_thread() là nội bộ của python và được sử dụng để xác định một luồng thực thi cụ thể.

Để biết thêm thông tin về luồng Linux, hãy xem trang man pthreads trên Linux.

+2

Vâng, nó không thực sự là PID mà tôi đề cập đến ở đây, nó là tid được báo cáo như là một 'PID' bằng cách nói, 'top' khi nhấn phím' H' để xem tất cả các chủ đề. – Phani

+0

Tôi đang sử dụng phiên bản Ubuntu 11.10. – Phani

4

Dưới đây là một bản vá để thay thế cho nhận dạng chủ đề trăn với TID như được hiển thị trong htop:

def patch_thread_identifier(): 
    """Replace python thread identifier by TID.""" 
    # Imports 
    import threading, ctypes 
    # Define get tid function 
    def gettid(): 
     """Get TID as displayed by htop.""" 
     libc = 'libc.so.6' 
     for cmd in (186, 224, 178): 
      tid = ctypes.CDLL(libc).syscall(cmd) 
      if tid != -1: 
       return tid 
    # Get current thread 
    current = threading.current_thread() 
    # Patch _get_ident 
    threading._get_ident = gettid 
    # Update active dictionary 
    threading._active[gettid()] = threading._active.pop(current.ident) 
    # Set new identifier for the current thread 
    current._set_ident() 
    # Done 
    print 'threading._get_ident patched!' 
Các vấn đề liên quan