Start を呼び出さないスレッドの途中実行
Python では、スレッド オブジェクトを作成しても、その実行は自動的に開始されません。ただし、start() メソッドが呼び出される前であっても、スレッドが実行を開始しているように見える可能性があります。この動作は、不適切なスレッド作成に起因する可能性があり、以下で説明します。
次のコード スニペットを考えてみましょう:
t1 = threading.Thread(target=self.read) print("something") t2 = threading.Thread(target=self.runChecks(), args=(self,))
この例では、self.read 関数は無期限に実行することを目的としています。プログラムが後続の print ステートメントに到達するのを妨げます。ただし、プログラムは print ステートメントを完全にスキップします。通常、スレッド上で start() を呼び出すと実行が開始され、直線的に進行するため、この動作は異常であるように見えます。
この問題の説明は、スレッドの作成に使用される構文にあります。最初の行では、self.read の後の括弧が関数を効果的に呼び出し、その戻り値をスレッドのターゲットとして割り当てます。これは、self.read が新しく作成されたスレッドではなく、実際にはメイン スレッドで実行されていることを意味します。
これを解決するには、ターゲット引数から括弧を削除するだけです。
t1 = threading.Thread(target=self.read) t1.start() print("something")
これにより、次のようになります。その self.read はスレッドによって実行されるターゲット関数となり、t1.start() が呼び出された後にのみ実行を開始します。
引数を必要とするターゲットの場合は、threading.Thread の args または kwargs パラメータを使用します。またはラムダ式を使用します。例:
thread = threading.Thread(target=lambda: f(a, b, x=c))
この構文は関数とその引数をスレッドに渡し、適切な実行を保証します。
ラムダ関数は定義時ではなく使用時に引数を評価することに注意してください。これは、スレッドをスケジュールする前に変数を再定義すると、予期しない結果が生じる可能性があることを意味します。
以上がPython で `start()` を呼び出す前にスレッドが実行されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。