首頁  >  文章  >  後端開發  >  為什麼我的執行緒在 Python 中呼叫 `start()` 之前運行?

為什麼我的執行緒在 Python 中呼叫 `start()` 之前運行?

Linda Hamilton
Linda Hamilton原創
2024-11-11 04:00:03383瀏覽

Why Does My Thread Run Before Calling `start()` in Python?

執行緒過早執行而不呼叫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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn