Python で `start()` を呼び出す前にスレッドが実行されるのはなぜですか?

Linda Hamilton
リリース: 2024-11-11 04:00:03
オリジナル
419 人が閲覧しました

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 関数は無期限に実行することを目的としています。プログラムが後続の 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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート