Saya memiliki program Python multi-threading, dan fungsi utilitas writeLog(message)
,, yang menulis timestamp diikuti oleh pesan. Sayangnya, file log yang dihasilkan tidak memberikan indikasi thread mana yang menghasilkan pesan mana.
Saya ingin writeLog()
dapat menambahkan sesuatu ke pesan untuk mengidentifikasi utas yang memanggilnya. Jelas saya bisa membuat utas menyampaikan informasi ini, tetapi itu akan menjadi lebih banyak pekerjaan. Apakah ada beberapa thread yang setara os.getpid()
yang bisa saya gunakan?
python
multithreading
python-multithreading
python-logging
Charles Anderson
sumber
sumber
threading.currentThread()
(camelCase, bukan camel_case) pada versi 2.5.threading.current_thread().ident
tidak tepatNone
. Mungkin masuk akal hanya untuk digunakanthread.get_ident()
dalam Python 2 danthreading.current_thread().ident
Python 3.thread.get_ident()
(threading.get_ident()
ditambahkan dengan Python 3.3 - ikuti link ke dokumentasi).Menggunakan modul logging Anda dapat secara otomatis menambahkan pengenal utas saat ini di setiap entri log. Cukup gunakan salah satu kunci pemetaan LogRecord ini dalam string format logger Anda:
dan atur handler default Anda dengannya:
sumber
<concurrent.futures.thread.ThreadPoolExecutor object at 0x7f00f882a438>_2
ini sebagai nama utas. Apakah itu dua adalah nomor utas saya yang dipanggilThe
thread.get_ident()
mengembalikan fungsi integer panjang di Linux. Ini bukan id utas.Saya menggunakan metode ini untuk benar-benar mendapatkan id utas di Linux:
sumber
Fungsi ini sekarang didukung oleh Python 3.8+ :)
https://github.com/python/cpython/commit/4959c33d2555b89b494c678d99be81a65ee864b0
https://github.com/python/cpython/pull/11993
sumber
Saya melihat contoh ID utas seperti ini:
Dokumen threading juga mencantumkan
name
atribut:sumber
Anda bisa mendapatkan identitas utas berjalan saat ini. Ident dapat digunakan kembali untuk utas lainnya, jika utas saat ini berakhir.
Ketika Anda membuat instance dari Thread, sebuah nama diberikan secara implisit ke thread, yang merupakan pola: Thread-number
Nama tidak memiliki arti dan namanya tidak harus unik. Identitas semua utas yang berjalan unik.
Fungsi threading.current_thread () mengembalikan utas berjalan saat ini. Objek ini menampung seluruh informasi utas.
sumber
Saya membuat banyak utas dengan Python, saya mencetak objek utas, dan saya mencetak id menggunakan
ident
variabel. Saya melihat semua id sama:sumber
ident
dikatakan dokumen :Thread identifiers may be recycled when a thread exits and another thread is created.
docs.python.org/2/library/threading.html#threading.Thread.identDemikian pula untuk @brucexin, saya perlu mendapatkan pengenal utas OS-level (yang! =
thread.get_ident()
) Dan menggunakan sesuatu seperti di bawah ini untuk tidak bergantung pada angka-angka tertentu dan hanya amd64:dan
ini tergantung pada Cython.
sumber
invalid syntax
pointer setelahextern
kata kunci. Apakah ada sesuatu yang saya lewatkan. Apakah penting bahwa kode berada dalam modul terpisah dan memiliki ekstensi pyx? Atau apakah ini kompilasi ulang?.pyx
file. Untuk "python murni" mungkin sesuatu yang serupa dapat dilakukan dengan ctypes juga.