GNU/Linux >> Znalost Linux >  >> Linux

ID vlákna Pythonu, jak je uvedeno nahoře

Zde je oprava, která nahradí identifikátor vlákna pythonu za TID jak je zobrazeno v 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 (or _get_ident in python 2)
    threading.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!")

Díky tomuto příspěvku jsem dostal vlákna Pythonu, aby nahlásila svá příslušná ID vláken. Nejprve proveďte grep -r 'SYS_gettid' /usr/include/' . Mám řádek:#define SYS_gettid __NR_gettid Po dalším greppingu o grep -r '__NR_gettid' /usr/include/ , Mám spoustu odpovídajících řádků:

/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

Nyní vyberte ten, který odpovídá vaší architektuře. Můj byl 186. Nyní zahrňte tento kód do všech svých skriptů vláken v Pythonu, abyste získali ID vlákna tak, jak je vidí OS:

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

Linux
  1. Jak nainstalovat Python na Linux

  2. Jak na to:Programování soketů v Pythonu

  3. Nejlepší SEO nástroje

  1. Převod kódu Python 2 na Python 3

  2. Top 20 použití Linuxu

  3. Otevření vlákna Pythonu v novém okně konzoly

  1. Je errno vlákno bezpečné?

  2. ID vlákna vs. rukojeť vlákna

  3. Skript Python nelze zabít pomocí Ctrl-C