J'ai un programme Python multi-thread et une fonction utilitaire writeLog(message)
, qui écrit un horodatage suivi du message. Malheureusement, le fichier journal résultant ne donne aucune indication sur quel thread génère quel message.
Je voudrais writeLog()
pouvoir ajouter quelque chose au message pour identifier quel thread l'appelle. Évidemment, je pourrais simplement faire en sorte que les threads transmettent ces informations, mais ce serait beaucoup plus de travail. Y a-t-il un équivalent de thread os.getpid()
que je pourrais utiliser?
python
multithreading
python-multithreading
python-logging
Charles Anderson
la source
la source
threading.currentThread()
(camelCase, pas camel_case) à partir de la version 2.5.threading.current_thread().ident
c'est inappropriéNone
. Il est probablement logique de l'utiliser simplementthread.get_ident()
en Python 2 etthreading.current_thread().ident
en Python 3.thread.get_ident()
(athreading.get_ident()
été ajouté dans Python 3.3 - suivez les liens vers la documentation).En utilisant le module de journalisation, vous pouvez ajouter automatiquement l'identificateur de thread actuel dans chaque entrée de journal. Utilisez simplement l'une de ces clés de mappage LogRecord dans la chaîne de format de votre enregistreur:
et configurez votre gestionnaire par défaut avec:
la source
<concurrent.futures.thread.ThreadPoolExecutor object at 0x7f00f882a438>_2
cela comme un nom de fil. Est-ce que deux est mon numéro de fil qui a invoquéLa
thread.get_ident()
fonction renvoie un entier long sous Linux. Ce n'est pas vraiment un identifiant de thread.J'utilise cette méthode pour vraiment obtenir l'identifiant du thread sous Linux:
la source
Cette fonctionnalité est désormais prise en charge par Python 3.8+ :)
https://github.com/python/cpython/commit/4959c33d2555b89b494c678d99be81a65ee864b0
https://github.com/python/cpython/pull/11993
la source
J'ai vu des exemples d'ID de thread comme celui-ci:
Le module de threading docs répertorie également l'
name
attribut:la source
Vous pouvez obtenir l'identifiant du thread en cours d'exécution. L'ident peut être réutilisé pour d'autres threads, si le thread actuel se termine.
Lorsque vous créez une instance de Thread, un nom est donné implicitement au thread, qui est le modèle: Thread-number
Le nom n'a aucune signification et le nom n'a pas besoin d'être unique. L'identifiant de tous les threads en cours d'exécution est unique.
La fonction threading.current_thread () renvoie le thread en cours d'exécution. Cet objet contient toutes les informations du fil.
la source
J'ai créé plusieurs threads en Python, j'ai imprimé les objets thread et j'ai imprimé l'id en utilisant la
ident
variable. Je vois que tous les identifiants sont identiques:la source
ident
disent les documents :Thread identifiers may be recycled when a thread exits and another thread is created.
docs.python.org/2/library/threading.html#threading.Thread.identDe la même manière que @brucexin, j'avais besoin d'obtenir un identifiant de thread au niveau du système d'exploitation (qui! =
thread.get_ident()
) Et d'utiliser quelque chose comme ci-dessous pour ne pas dépendre de nombres particuliers et être uniquement amd64:et
cela dépend cependant de Cython.
la source
invalid syntax
pointeur aprèsextern
mot-clé. Y a-t-il quelque chose qui me manque? Est-il important que le code soit dans un module séparé et ait l'extension pyx? Ou est-ce une (re) compilation?.pyx
fichier. Pour "python pur", quelque chose de similaire pourrait probablement être fait avec les ctypes.