簡體   English   中英

如何在pyqt中設置QThread的名稱?

[英]How to set the name of a QThread in pyqt?

我正在使用QtCore.QThread (來自PyQt4 )。

要記錄,我還使用以下格式化程序:

logging.Formatter('%(levelname)-8s %(asctime)s %(threadName)-15s %(message)s')

結果日志是:

調試 2012-10-01 03:59:31,479 Dummy-3 my_message

我的問題是我想更明確地知道哪個線程正在記錄...... Dummy-3對我來說不是最明確的名字......

有沒有辦法為日志模塊(作為 LogRecord 屬性)使用的QtCore.QThread設置一個名稱,以便使日志更有意義?

謝謝 !

如果線程模塊可用,日志模塊將使用threading.current_thread().name設置threadName LogRecord 屬性。

但是threading.current_thread文檔說如果當前線程不是由線程模塊創建的(因此是“Dummy-x”名稱),則將使用一個虛擬線程對象。

我想可以通過猴子補丁threading.current_thread將名稱重置為更合適的名稱。 但肯定更好的方法是在記錄消息時使用extra字典:

logging.Formatter('%(levelname)-8s %(asctime)s %(qthreadname)-15s %(message)s')
...
extras = {'qthreadname': get_qthreadname()}
logging.warning(message, extra=extras)

Qt5 文檔中,您可以調用setObjectName()來修改線程名稱

要選擇線程的名稱(例如,在 Linux 上由命令 ps -L 標識),您可以在啟動線程之前調用 setObjectName()。

如果您不調用 setObjectName(),則為線程指定的名稱將是線程對象的運行時類型的類名(例如,在 Mandelbrot 示例中為“RenderThread”,因為這是QThread 子類)。

不幸的是,它還指出:

這目前不適用於 Windows 上的發布版本。

我確實遇到了您的問題:我在主線程中運行了一個 Qt GUI 應用程序,並且在單獨的線程中運行了幾個 Worker。

我開始使用 Ekhumoro 建議的extras = {'qthreadname': get_qthreadname()}方法,但問題是使用日志記錄與其他庫集成。 如果您不提供額外的字典,則日志記錄將拋出文檔中所寫的異常,此處總結:

如果您選擇在記錄的消息中使用這些屬性,則需要格外小心。 例如,在上面的示例中,Formatter 已經設置了一個格式字符串,該字符串在 LogRecord 的屬性字典中需要“clientip”和“user”。 如果缺少這些,則不會記錄該消息,因為會發生字符串格式異常。 所以在這種情況下,你總是需要用這些鍵傳遞額外的字典。 雖然這可能很煩人,但此功能旨在用於特殊情況,例如在許多上下文中執行相同代碼的多線程服務器,並且出現的有趣條件取決於此上下文(例如遠程客戶端 IP 地址和經過身份驗證的用戶名,在上面的示例中)。 在這種情況下,專門的格式化程序可能會與特定的處理程序一起使用。

我沒有找到專門的格式化程序和處理程序,而是找到了一種不同的方法。 QThread 也是一個線程,您始終可以獲取對當前線程的引用並設置其名稱。 這是我的代碼片段:

import threading
# 
# your code
worker = MyWorker()
worker_thread = QThread()
worker_thread.setObjectName('MyThread')
worker.moveToThread(worker_thread)
#
# your code


class MyWorker(QtCore.QtObject):
   # your code

   def start(self):
       threading.current_thread().name = QtCore.QThread.currentThread().objectName() 
       # your code

現在所有來自 QThread 的日志消息都被正確識別了。

我希望它可以幫助你!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM