ホームページ > バックエンド開発 > Python チュートリアル > Python で `Thread.start()` を呼び出す前にスレッドが実行されるのはなぜですか?

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

Susan Sarandon
リリース: 2024-11-10 08:11:02
オリジナル
667 人が閲覧しました

Why Does My Thread Run Before Calling `Thread.start()` in Python?

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

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