Python でスレッドを明示的に呼び出さないとスレッドの実行が異常になるのはなぜですか?

Linda Hamilton
リリース: 2024-11-09 15:48:02
オリジナル
275 人が閲覧しました

Why Does My Thread Execution Anomalous When I Don't Explicitly Invoke Threads in Python?

スレッド実行の異常: 時期尚早なスレッド呼び出しを解明する

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 サイトの他の関連記事を参照してください。

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