Mam wielowątkowy program w Pythonie i funkcję narzędziową writeLog(message)
, która zapisuje znacznik czasu, po którym następuje komunikat. Niestety, wynikowy plik dziennika nie wskazuje, który wątek generuje dany komunikat.
Chciałbym writeLog()
móc dodać coś do wiadomości, aby określić, który wątek ją wywołuje. Oczywiście mógłbym po prostu zmusić wątki do przekazywania tych informacji, ale wymagałoby to znacznie więcej pracy. Czy jest jakiś odpowiednik wątku os.getpid()
, którego mógłbym użyć?
python
multithreading
python-multithreading
python-logging
Charles Anderson
źródło
źródło
threading.currentThread()
(camelCase, a nie camel_case) od wersji 2.5.threading.current_thread().ident
jest nieprawidłowyNone
. Prawdopodobnie ma sens po prostu użyciethread.get_ident()
w Pythonie 2 ithreading.current_thread().ident
Pythonie 3.thread.get_ident()
(threading.get_ident()
dodano w Pythonie 3.3 - wykonaj linki do dokumentacji).Korzystając z modułu rejestrowania , możesz automatycznie dodać bieżący identyfikator wątku do każdego wpisu dziennika. Po prostu użyj jednego z tych kluczy mapowania LogRecord w ciągu formatu loggera:
i skonfiguruj z nim domyślną procedurę obsługi:
źródło
<concurrent.futures.thread.ThreadPoolExecutor object at 0x7f00f882a438>_2
to jako nazwę wątku. Czy to dwa to numer mojego wątku, który wywołałthread.get_ident()
Zwraca długą liczbę całkowitą w systemie Linux. To naprawdę nie jest identyfikator wątku.Używam tej metody, aby naprawdę uzyskać identyfikator wątku w systemie Linux:
źródło
Ta funkcja jest teraz obsługiwana przez Python 3.8+ :)
https://github.com/python/cpython/commit/4959c33d2555b89b494c678d99be81a65ee864b0
https://github.com/python/cpython/pull/11993
źródło
Widziałem przykłady takich identyfikatorów wątków:
W docs modułu gwintowania listy
name
atrybutów, a także:źródło
Możesz uzyskać identyfikator aktualnie działającego wątku. Identyfikator może zostać ponownie użyty dla innych wątków, jeśli bieżący wątek się zakończy.
Kiedy tworzysz wystąpienie Thread, wątkowi jest nadawana niejawna nazwa, która jest wzorcem: Numer-wątku
Nazwa nie ma znaczenia i nie musi być unikalna. Identyfikator wszystkich uruchomionych wątków jest unikalny.
Funkcja threading.current_thread () zwraca bieżący wątek. Ten obiekt zawiera wszystkie informacje o wątku.
źródło
Utworzyłem wiele wątków w Pythonie, wydrukowałem obiekty wątków i wydrukowałem id za pomocą
ident
zmiennej. Widzę, że wszystkie identyfikatory są takie same:źródło
ident
mówią dokumenty :Thread identifiers may be recycled when a thread exits and another thread is created.
docs.python.org/2/library/threading.html#threading.Thread.identPodobnie jak w przypadku @brucexin, potrzebowałem uzyskać identyfikator wątku na poziomie systemu operacyjnego (który! =
thread.get_ident()
) I użyć czegoś takiego jak poniżej, aby nie polegać na konkretnych liczbach i być tylko amd64:i
zależy to jednak od Cythona.
źródło
invalid syntax
wskaźnik poextern
słowie kluczowym. Czy jest coś, czego mi brakuje. Czy ważne jest, aby kod znajdował się w osobnym module i miał rozszerzenie pyx? A może jest to (ponowna) kompilacja?.pyx
pliku. Dla „czystego Pythona” prawdopodobnie coś podobnego można by zrobić z ctypami.