Thread.start を呼び出す前にスレッドが実行を開始する
Python では、スレッド化により、単一プログラム内で複数のスレッドを作成および実行できます。よくある誤解は、明示的に Thread.start() を呼び出さなくても、スレッドは作成された直後に実行を開始するということです。しかし、そうではありません。
次のコード スニペットを考えてみましょう:
import threading t1 = threading.Thread(target=self.read()) print("something") t2 = threading.Thread(target=self.runChecks(), args=(self,))
この例では、2 つのスレッド t1 と t2 が作成されていますが、どちらもまだ開始されていません。 self.read() 関数は無限に実行されます。つまり、プログラムは決して印刷行に到達しません。この動作は、スレッドを開始して次の行に進むことが期待される t1.start() を呼び出していないにもかかわらず発生します。
この予期しない動作の理由は、target=self の後の末尾括弧にあります。読む()。この構文は実際には self.read() 関数をすぐに呼び出し、戻り値をターゲット引数として Thread コンストラクターに渡します。 Python は関数がターゲットとして渡されることを期待しているため、解決策は末尾の括弧を削除し、明示的に t1.start() を呼び出してスレッドを開始することです。
import threading t1 = threading.Thread(target=self.read) t1.start() print("something")
または、ターゲット関数に引数が必要な場合は、 、threading.Thread に args および kwargs 引数を使用するか、コンストラクターに渡すラムダ関数を定義できます。ラムダの使用を選択した場合、ラムダが定義されたときではなく、スレッドがスケジュールされたときに関数とその引数が検索されることに注意してください。スレッドの実行を開始する前に変数を再割り当てすると、予期しない結果が生じる可能性があります。
以上がPython で `Thread.start()` を呼び出す前にスレッドが実行されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。