Python でスレッドを作成するときは、start( ) 方法。ただし、ターゲット関数がスレッド作成構文内で呼び出される状況では、興味深い問題が発生します。
考慮してください次のコード スニペット:
t1 = threading.Thread(target=self.read()) print("something") t2 = threading.Thread(target=self.runChecks(), args=(self,))
驚くべきことに、self.read が無期限に実行され、プログラムが次の行に到達できないため、print ステートメントは実行されません。 t1.start() を呼び出すとスレッドの実行が開始され、プログラムが続行できるようになるため、この動作は直観に反しているように見えます。
問題は、self.read() の後の括弧にあります。 Python では、関数の直後に続くかっこによって関数が呼び出されるため、次のコード:
target=self.read()
は実際に self.read を呼び出し、その戻り値をターゲット引数として Thread に渡します。ただし、Thread は戻り値ではなく関数参照を期待します。この動作を修正するには、単に括弧を削除し、スレッドの作成後に t1.start() を明示的に呼び出します。
t1 = threading.Thread(target=self.read) t1.start() print("something")
Whenターゲット関数には引数が必要です。threading.Thread の args または kwargs 引数を使用します。あるいは、以下に示すように、ラムダ関数を使用します。
thread = threading.Thread(target=f, args=(a, b), kwargs={'x': c})
または
thread = threading.Thread(target=lambda: f(a, b, x=c))
ラムダを使用する場合、関数の引数はラムダが呼び出されたときではなく、呼び出されたときに評価されることに注意してください。それは定義されています。スレッドのスケジューリング前に変数が再割り当てされると、予期しない結果が生じる可能性があります。
以上がPython でスレッドを明示的に呼び出さないとスレッドの実行が異常になるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。