source

Python에서 스레드 ID를 얻는 방법

manysource 2022. 12. 24. 17:45

Python에서 스레드 ID를 얻는 방법

멀티스레딩 파이썬 프로그램과 유틸리티 기능을 가지고 있습니다.writeLog(message)타임스탬프 뒤에 메시지를 씁니다.유감스럽게도 결과 로그 파일에는 어떤 스레드가 어떤 메시지를 생성하는지 알 수 없습니다.

하고 싶다writeLog()메시지를 호출하는 스레드를 식별하기 위해 메시지에 무언가를 추가할 수 있습니다.물론 스레드로 이 정보를 전달하게 할 수는 있지만, 훨씬 더 많은 작업이 필요할 것입니다.에 상당하는 스레드가 있습니까?os.getpid()내가 쓸 수 있을까?

threading.get_ident() 동작하고 있다, 또는threading.currentThread().ident(Python < 2.6)의 경우).

로깅 모듈을 사용하면 각 로그 엔트리에 현재 스레드 ID를 자동으로 추가할 수 있습니다.로거 형식의 문자열에서 다음 LogRecord 매핑키 중 하나를 사용합니다.

%(스레드)d : 스레드 ID(사용 가능한 경우).

%(threadName)s : 스레드 이름(사용 가능한 경우).

디폴트 핸들러를 설정합니다.

logging.basicConfig(format="%(threadName)s:%(message)s")

thread.get_ident()함수는 Linux에서 긴 정수를 반환합니다.스레드 ID가 아닙니다.

Linux에서 스레드 ID를 가져오려면 다음 방법을 사용합니다.

import ctypes
libc = ctypes.cdll.LoadLibrary('libc.so.6')

# System dependent, see e.g. /usr/include/x86_64-linux-gnu/asm/unistd_64.h
SYS_gettid = 186

def getThreadId():
   """Returns OS thread id - Specific to Linux"""
   return libc.syscall(SYS_gettid)

이 기능은 현재 Python 3.8+에서 지원됩니다. : )

이제 다음을 사용할 수 있습니다.threading.get_native_id()

https://github.com/python/cpython/commit/4959c33d2555b89b494c678d99be81a65ee864b0

https://github.com/python/cpython/pull/11993

현재 실행 중인 스레드의 ID를 얻을 수 있습니다.현재 스레드가 종료된 경우 ID를 다른 스레드에 재사용할 수 있습니다.

스레드 인스턴스를 상자화하면 스레드에 암묵적인 이름(패턴)이 지정됩니다.스레드 번호

이름은 의미가 없으며 고유할 필요가 없습니다.실행 중인 모든 스레드의 ID는 고유합니다.

import threading


def worker():
    print(threading.current_thread().name)
    print(threading.get_ident())


threading.Thread(target=worker).start()
threading.Thread(target=worker, name='foo').start()

threading.current_thread() 함수는 현재 실행 중인 스레드를 반환합니다.이 개체는 스레드의 전체 정보를 보관합니다.

다음과 같은 스레드 ID의 예를 보았습니다.

class myThread(threading.Thread):
    def __init__(self, threadID, name, counter):
        self.threadID = threadID
        ...

스레드화 모듈의 문서 목록nameAtribute도 마찬가지입니다.

...

A thread has a name. 
The name can be passed to the constructor, 
and read or changed through the name attribute.

...

Thread.name

A string used for identification purposes only. 
It has no semantics. Multiple threads may
be given the same name. The initial name is set by the constructor.

Python에서 여러 스레드를 만들고 스레드 오브젝트를 인쇄하고 ID를 인쇄합니다.ident변수.모든 ID가 동일한 것을 알 수 있습니다.

<Thread(Thread-1, stopped 140500807628544)>
<Thread(Thread-2, started 140500807628544)>
<Thread(Thread-3, started 140500807628544)>

@sysin과 마찬가지로 OS 레벨의 스레드 식별자를 취득할 필요가 있었습니다(이것은!=).thread.get_ident()특정 번호에 의존하지 않고 amd64 전용으로 하기 위해 다음과 같은 것을 사용합니다.

---- 8< ---- (xos.pyx)
"""module xos complements standard module os""" 

cdef extern from "<sys/syscall.h>":                                                             
    long syscall(long number, ...)                                                              
    const int SYS_gettid                                                                        

# gettid returns current OS thread identifier.                                                  
def gettid():                                                                                   
    return syscall(SYS_gettid)                                                                  

그리고.

---- 8< ---- (test.py)
import pyximport; pyximport.install()
import xos

...

print 'my tid: %d' % xos.gettid()

하지만 이건 시튼에 달려있어요.

언급URL : https://stackoverflow.com/questions/919897/how-to-obtain-a-thread-id-in-python