Eu tenho um programa Python com vários threads e uma função de utilitário writeLog(message)
, que grava um carimbo de data e hora seguido pela mensagem. Infelizmente, o arquivo de log resultante não fornece indicação de qual thread está gerando qual mensagem.
Gostaria writeLog()
de poder adicionar algo à mensagem para identificar qual thread está chamando. Obviamente, eu poderia fazer com que os threads passassem essas informações, mas isso seria muito mais trabalhoso. Existe algum segmento equivalente ao os.getpid()
que eu poderia usar?
python
multithreading
python-multithreading
python-logging
Charles Anderson
fonte
fonte
threading.currentThread()
(camelCase, não camel_case) a partir da versão 2.5.threading.current_thread().ident
é inapropriadoNone
. Provavelmente faz sentido apenas usarthread.get_ident()
no Python 2 ethreading.current_thread().ident
no Python 3. #thread.get_ident()
(threading.get_ident()
foi adicionada no Python 3.3 - siga os links para a documentação).Usando o módulo de log , você pode adicionar automaticamente o identificador de segmento atual em cada entrada de log. Basta usar uma dessas chaves de mapeamento do LogRecord na sua sequência de formato de logger:
e configure seu manipulador padrão com ele:
fonte
<concurrent.futures.thread.ThreadPoolExecutor object at 0x7f00f882a438>_2
isso como um nome de thread. É que dois é o meu número de discussão que invocadoA
thread.get_ident()
função retorna um número inteiro longo no Linux. Não é realmente um ID de thread.Eu uso esse método para realmente obter a identificação do segmento no Linux:
fonte
Esta funcionalidade agora é suportada pelo Python 3.8+ :)
https://github.com/python/cpython/commit/4959c33d2555b89b494c678d99be81a65ee864b0
https://github.com/python/cpython/pull/11993
fonte
Eu vi exemplos de IDs de threads como este:
Os documentos do módulo de encadeamento listam também o
name
atributo:fonte
Você pode obter o ident do segmento em execução atual. O ident pode ser reutilizado para outros encadeamentos, se o encadeamento atual terminar.
Quando você cria uma instância do Thread, é atribuído um nome implícito ao thread, que é o padrão: Thread-number
O nome não tem significado e o nome não precisa ser exclusivo. O ident de todos os threads em execução é exclusivo.
A função threading.current_thread () retorna o thread em execução atual. Este objeto contém todas as informações do encadeamento.
fonte
Criei vários threads em Python, imprimi os objetos de thread e imprimi o ID usando a
ident
variável Vejo que todos os IDs são iguais:fonte
ident
dizer:Thread identifiers may be recycled when a thread exits and another thread is created.
docs.python.org/2/library/threading.html#threading.Thread.identDa mesma forma que o @brucexin, eu precisava obter o identificador de segmento no nível do SO (que! =
thread.get_ident()
) E usar algo como abaixo para não depender de números específicos e ser apenas para amd64:e
isso depende do Cython.
fonte
invalid syntax
ponteiro apósextern
palavra-chave. Tem algo que estou perdendo. É importante que o código esteja em um módulo separado e tenha a extensão pyx? Ou isso é uma coisa de (re) compilação?.pyx
arquivo. Para "python puro", provavelmente algo semelhante também poderia ser feito com ctypes.