У меня есть многопоточная программа Python и служебная функция writeLog(message)
, которая записывает метку времени, за которой следует сообщение. К сожалению, полученный файл журнала не указывает, какой поток генерирует какое сообщение.
Я хотел бы writeLog()
иметь возможность добавить что-то к сообщению, чтобы определить, какой поток вызывает его. Очевидно, я мог бы просто заставить потоки передавать эту информацию, но это было бы намного больше работы. Есть ли какой-нибудь поток-эквивалент, os.getpid()
который я мог бы использовать?
python
multithreading
python-multithreading
python-logging
Чарльз Андерсон
источник
источник
threading.currentThread()
(camelCase, а не camel_case) начиная с версии 2.5.threading.current_thread().ident
которая неуместнаNone
. Вероятно, имеет смысл просто использоватьthread.get_ident()
в Python 2 иthreading.current_thread().ident
в Python 3.thread.get_ident()
(threading.get_ident()
был добавлен в Python 3.3 - следовать ссылкам на документацию).Используя модуль регистрации, вы можете автоматически добавлять текущий идентификатор потока в каждую запись журнала. Просто используйте один из этих ключей сопоставления LogRecord в строке формата вашего регистратора:
и установите ваш обработчик по умолчанию с ним:
источник
<concurrent.futures.thread.ThreadPoolExecutor object at 0x7f00f882a438>_2
это как имя потока. Это два, это мой номерthread.get_ident()
Функция возвращает длинное целое на Linux. Это на самом деле не идентификатор потока.Я использую этот метод, чтобы действительно получить идентификатор потока в Linux:
источник
Эта функциональность теперь поддерживается Python 3.8+ :)
https://github.com/python/cpython/commit/4959c33d2555b89b494c678d99be81a65ee864b0
https://github.com/python/cpython/pull/11993
источник
Я видел примеры идентификаторов потоков, как это:
В модуле потоковой Docs списков
name
атрибуты , а также:источник
Вы можете получить идентификатор текущего запущенного потока. Идентификатор может быть повторно использован для других потоков, если текущий поток заканчивается.
Когда вы создаете экземпляр Thread, для потока дается неявное имя, которое является шаблоном: номер потока
Имя не имеет значения, и имя не обязательно должно быть уникальным. Идентификатор всех запущенных потоков уникален.
Функция threading.current_thread () возвращает текущий запущенный поток. Этот объект содержит всю информацию о потоке.
источник
Я создал несколько потоков в Python, я напечатал объекты потоков, и я напечатал идентификатор, используя
ident
переменную. Я вижу, все идентификаторы одинаковы:источник
ident
говорят документы :Thread identifiers may be recycled when a thread exits and another thread is created.
docs.python.org/2/library/threading.html#threading.Thread.identКак и @brucexin, мне нужно было получить идентификатор потока на уровне ОС (который! =
thread.get_ident()
) И использовать что-то вроде ниже, чтобы не зависеть от конкретных чисел и быть только для amd64:и
это зависит от Cython, хотя.
источник
invalid syntax
указатель заextern
ключевым словом. Есть что-то, что я пропускаю. Важно ли, чтобы код был в отдельном модуле и имел расширение pyx? Или это (пере) компиляция?.pyx
файле. Для «чистого питона», вероятно, нечто подобное можно сделать и с ctypes.