Вопрос

У меня есть многопоточная программа Python и служебная функция, writeLog(message), который записывает временную метку, за которой следует сообщение.К сожалению, полученный файл журнала не дает информации о том, какой поток какое сообщение генерирует.

Я хотел бы writeLog() чтобы иметь возможность добавить что-то к сообщению, чтобы определить, какой поток его вызывает.Очевидно, я мог бы просто заставить потоки передавать эту информацию, но это потребовало бы гораздо больше работы.Есть ли какой-нибудь эквивалент потока os.getpid() что я мог бы использовать?

Это было полезно?

Решение

threading.get_ident() работает, или threading.current_thread().ident (или threading.currentThread().ident для Python < 2.6).

Другие советы

Используя Ведение журнала модуль, вы можете автоматически добавлять текущий идентификатор потока в каждую запись журнала.Просто используйте один из этих ЖурналЗапись ключи сопоставления в строке формата вашего журнала:

%(поток)d : Идентификатор потока (если доступен).

%(имя потока)s : Название темы (если есть).

и настройте с ним обработчик по умолчанию:

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

А thread.get_ident() функция возвращает длинное целое число в Linux.На самом деле это не идентификатор потока.

я использую Этот метод чтобы действительно получить идентификатор потока в Linux:

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)

Я видел примеры таких идентификаторов потоков:

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.

Вы можете получить идентификатор текущего запущенного потока.Идентификатор может быть повторно использован для других потоков, если текущий поток завершится.

Когда вы создаете экземпляр Thread, потоку неявно присваивается имя, которое является шаблоном:Номер потока

Имя не имеет значения, и имя не обязательно должно быть уникальным.Идентификатор всех запущенных потоков уникален.

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() возвращает текущий запущенный поток.Этот объект содержит всю информацию о потоке.

Эта функциональность теперь поддерживается Python 3.8+ :)

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

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

Я создал несколько потоков в Python, распечатал объекты потоков и напечатал идентификатор, используя ident переменная.Я вижу, что все идентификаторы одинаковы:

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

Как и в случае с @brucexin, мне нужно было получить идентификатор потока на уровне ОС (который != 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top