Python - メインスレッド
こんにちは、夢を追い求めるプログラマーの皆さん!今日、私たちはPythonのスレッド操作について、特にメインスレッドにフォーカスして、興奮な旅に出かけます。あなたの親しみのある近所のコンピュータサイエンスの先生として、私はこの魅力的なトピックをガイドしてあなたを迎え入れます。プログラミングが初めての方でも心配しないでください - 基本から始めて段階的に進みます。だから、お気に入りの飲み物をお持ち、快適に座り、一緒に飛び込みましょう!
メインスレッドとは?
具体的に掘り下げる前に、スレッドとは何かを理解しましょう。本を読んでいる間に音楽を聞いているとしましょう。あなたの脳は2つのタスクを同時に行っています - これはプログラミングのスレッドがどのように働くのに似ています。メインスレッドは、Pythonスクリプトを実行したときに始まる、あなたのプログラムの主要なストーリーラインのようなものです。
メインスレッドの動作
簡単な例からメインスレッドの動作を見てみましょう:
import threading
import time
def print_current_thread():
print(f"Current thread: {threading.current_thread().name}")
print_current_thread()
time.sleep(2)
print("Main thread is still running!")
このスクリプトを実行すると、以下のようなものが表示されます:
Current thread: MainThread
Main thread is still running!
この例では、threading
モジュールを使用して現在のスレッドに関する情報にアクセスしています。time.sleep(2)
関数は、プログラミングのストーリーの中で少しのポーズを追加するために存在しています。
メインスレッドへのアクセス
メインスレッドの動作を見たところ、それを直接アクセスする方法を学びましょう。Pythonはこれを行う便利な方法を提供しています:
import threading
main_thread = threading.main_thread()
print(f"Main thread name: {main_thread.name}")
print(f"Main thread ID: {main_thread.ident}")
このスクリプトは以下のような出力をします:
Main thread name: MainThread
Main thread ID: 140735268892672
ident
はスレッドの一意の識別子です。これはスレッドの社会保険番号のようなものであり、2つのスレッドが同じIDを持つことはありません。
メインスレッドにいるかどうかの確認
時々、コードがメインスレッドで実行されているかどうかを確認したい場合があります。以下のようにそれを行うことができます:
import threading
def am_i_main():
return threading.current_thread() == threading.main_thread()
print(f"Are we in the main thread? {am_i_main()}")
def not_main():
print(f"Are we in the main thread now? {am_i_main()}")
thread = threading.Thread(target=not_main)
thread.start()
thread.join()
このスクリプトは以下のような出力をします:
Are we in the main thread? True
Are we in the main thread now? False
この例では、新しいスレッドを作成し、not_main()
関数を実行します。この新しいスレッドからam_i_main()
を呼び出すと、False
が返されます。
Pythonのメインスレッドの挙動
Pythonのメインスレッドには、理解する必要がある興味深い挙動があります。それを探ってみましょう!
メインスレッドとプログラムの終了
メインスレッドのキーエビエンスとして、それが実行を完了すると、Pythonプログラム全体が通常は終了します。これを動作に見てみましょう:
import threading
import time
def long_task():
print("Starting a long task...")
time.sleep(5)
print("Long task finished!")
thread = threading.Thread(target=long_task)
thread.start()
print("Main thread is done!")
このスクリプトを実行すると、以下のようなものが表示されます:
Starting a long task...
Main thread is done!
"Long task finished!"というメッセージが表示されないことに注意してください。これは、メインスレッドが終了し、長時間のタスクが完了する前にプログラムが終了したからです。
デーモンスレッドと非デーモンスレッド
メインスレッドの挙動をよりよく理解するために、デーモンスレッドについて話しましょう。デーモンスレッドは、プログラムの終了を妨げることなくバックグラウンドタスクのようなものです。前の例を修正してみましょう:
import threading
import time
def long_task():
print("Starting a long task...")
time.sleep(5)
print("Long task finished!")
thread = threading.Thread(target=long_task)
thread.daemon = True # Set the thread as a daemon
thread.start()
print("Main thread is done!")
出力は前と同じになります。しかし、thread.daemon = True
という行を削除すると、以下のようになります:
Starting a long task...
Main thread is done!
Long task finished!
これは、非デーモンスレッド(デフォルト)がプログラムを終了するのを妨げるからです。
メインスレッドが他のスレッドを待つ
多くの場合、メインスレッドが他のスレッドが完了するのを待ってからプログラムを終了させたいことがあります。Pythonはこれを行う簡単な方法を提供しています:
import threading
import time
def task(name):
print(f"Task {name} starting...")
time.sleep(2)
print(f"Task {name} finished!")
threads = []
for i in range(3):
t = threading.Thread(target=task, args=(f"T{i}",))
threads.append(t)
t.start()
for t in threads:
t.join()
print("All tasks completed!")
このスクリプトは以下のような出力をします:
Task T0 starting...
Task T1 starting...
Task T2 starting...
Task T0 finished!
Task T1 finished!
Task T2 finished!
All tasks completed!
join()
メソッドは、各スレッドが作業を完了するまでメインスレッドを待機させます。
スレッド操作に便利なメソッドの一覧表
以下は、私たちが話してきたスレッド操作の便利なメソッドと、その他のいくつかのメソッドです:
メソッド | 説明 |
---|---|
threading.current_thread() |
現在のThreadオブジェクトを返します |
threading.main_thread() |
メインのThreadオブジェクトを返します |
Thread.start() |
スレッドのアクティビティを開始します |
Thread.join() |
スレッドが終了するまで待機します |
Thread.is_alive() |
スレッドがアライブであるかどうかを返します |
Thread.setDaemon(bool) |
スレッドのデーモンフラグを設定します |
結論
おめでとうございます!あなたはPythonのスレッド操作に踏み出した第一歩を歩みました。私たちはメインスレッド、それをどのようにアクセスするか、その挙動、および他のスレッドとのやり取りについてカバーしました。スレッド操作は複雑なトピックですが、実践すればより Comfortableになります。
私たちの話が終わりに近づくと、有名なコンピュータサイエンス者であるアラン・ケイの言葉が頭に浮かびます:"未来を予測する最善の方法は、それを発明することです。" Pythonのスレッドについての新たな知識を持っている今、あなたは驚くべきマルチスレッドプログラムを発明する準備が整いました!
コーディングを続け、学び続け、そして最も重要なのは、楽しんでください!次回まで、ハッピースレッディング!
Credits: Image by storyset