답변:
threading.get_ident()
작동하거나 threading.current_thread().ident
(또는 threading.currentThread().ident
Python <2.6).
threading.currentThread()
2.5 버전에서 (camel_case가 아닌 camelCase) 를 원합니다 .
threading.current_thread().ident
부적절한 버그가있는 것으로 보입니다 None
. 아마도 thread.get_ident()
파이썬 2와 threading.current_thread().ident
파이썬 3에서 사용하는 것이 합리적 일 것입니다.
thread.get_ident()
( threading.get_ident()
Python 3.3에 추가되었습니다-설명서 링크를 따르십시오).
로깅 모듈을 사용하면 각 로그 항목에 현재 스레드 식별자를 자동으로 추가 할 수 있습니다. 로거 형식 문자열에서 다음 LogRecord 매핑 키 중 하나를 사용 하십시오.
% (thread) d : 스레드 ID (사용 가능한 경우).
% (threadName) s : 스레드 이름 (사용 가능한 경우).
기본 핸들러를 설정하십시오.
logging.basicConfig(format="%(threadName)s:%(message)s")
<concurrent.futures.thread.ThreadPoolExecutor object at 0x7f00f882a438>_2
스레드 이름으로 얻고 있습니다. 이 호출 내 스레드 수 있다는 것이다
이 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 이상에서 지원됩니다. :)
https://github.com/python/cpython/commit/4959c33d2555b89b494c678d99be81a65ee864b0
다음과 같은 스레드 ID의 예를 보았습니다.
class myThread(threading.Thread):
def __init__(self, threadID, name, counter):
self.threadID = threadID
...
스레딩 모듈 문서의 목록 name
뿐만 아니라 속성 :
...
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.
현재 실행중인 스레드의 ID를 얻을 수 있습니다. 현재 스레드가 종료되면 ID를 다른 스레드에 재사용 할 수 있습니다.
Thread의 인스턴스를 만들 때 이름은 스레드에 암시 적으로 주어지며 패턴은 Thread-number입니다.
이름은 의미가 없으며 고유하지 않아도됩니다. 실행중인 모든 스레드의 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 () 함수는 현재 실행중인 스레드를 반환합니다. 이 객체는 스레드의 전체 정보를 보유합니다.
파이썬에서 여러 스레드를 만들었고 스레드 개체를 인쇄했으며 ident
변수를 사용하여 id를 인쇄했습니다 . 모든 ID가 동일하다는 것을 알았습니다.
<Thread(Thread-1, stopped 140500807628544)>
<Thread(Thread-2, started 140500807628544)>
<Thread(Thread-3, started 140500807628544)>
ident
Thread identifiers may be recycled when a thread exits and another thread is created.
@brucexin과 마찬가지로 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()
이것은 Cython에 달려 있습니다.
invalid syntax
뒤에 포인터가 extern
있습니다. 내가 놓친 것이 있습니까? 코드가 별도의 모듈에 있고 pyx 확장자를 갖는 것이 중요합니까? 아니면 이것이 (재) 컴파일입니까?
.pyx
파일에 있어야합니다 . "순수한 파이썬"의 경우 아마도 ctypes로 비슷한 것을 할 수 있습니다.