執行緒過早執行而不呼叫Start
在Python中,建立執行緒物件不會自動開始執行。但是,執行緒有可能甚至在呼叫 start() 方法之前就開始運行。此行為可歸因於線程創建不當,解釋如下。
考慮以下程式碼片段:
t1 = threading.Thread(target=self.read) print("something") t2 = threading.Thread(target=self.runChecks(), args=(self,))
在此範例中,self.read 函數旨在無限期運行,阻止程式到達後續的列印語句。但是,程式完全跳過列印語句。這種行為看起來很反常,因為在執行緒上呼叫 start() 通常會允許其執行開始並線性進行。
此問題的解釋在於用於建立執行緒的語法。在第一行中, self.read 之後的括號有效地呼叫該函數並將其傳回值指定為執行緒的目標。這意味著 self.read 實際上是在主執行緒中運行,而不是新建立的執行緒。
要解決此問題,只需從目標參數中刪除括號即可:
t1 = threading.Thread(target=self.read) t1.start() print("something")
這可以確保self.read 成為執行緒要執行的目標函數,並且僅在呼叫t1 .start() 後才開始執行。
對於需要參數的目標,請使用threading.Thread 的 args 或 kwargs 參數或使用 lambda 表達式。例如:
thread = threading.Thread(target=lambda: f(a, b, x=c))
此語法將函數及其參數傳遞給線程,並確保正確執行。
請記住,lambda 函數在使用時評估其參數,而不是在定義時評估其參數。這意味著在調度執行緒之前重新定義變數可能會導致意外結果。
以上是為什麼我的執行緒在 Python 中呼叫 `start()` 之前運行?的詳細內容。更多資訊請關注PHP中文網其他相關文章!