Python - スレッドの作成
こんにちは、Pythonプログラマー志望の皆さん!今日は、スレッドの興味深い世界に飛び込んでいきましょう。スレッドについて聞いたことがないという方も心配しないでください。私たちは最初から始め、少しずつ進んでいきます。このチュートリアルの最後には、プロのようにスレッドを作成できるようになる予定です!
スレッドとは?
スレッドを作成する前に、まず何がスレッドであるかを理解しましょう。複雑な料理を作るときを想像してみてください。すべてを一つずつではなく、パスタを一つのボイラーで沸騰させながら、もう一つの場所で野菜を切っていることもあります。これは、プログラミングの中でのスレッドの仕組みに似ています。スレッドは、プログラムの異なる部分を同時に実行させ、コードをより効率的にします。
関数を使ってスレッドを作成
Pythonでスレッドを作成する最も簡単な方法は、関数を使用することです。基本の例から始めましょう:
import threading
import time
def print_numbers():
for i in range(5):
print(f"Number {i}")
time.sleep(1)
# スレッドを作成
thread = threading.Thread(target=print_numbers)
# スレッドを開始
thread.start()
print("メインスレッドは引き続き実行されます")
# スレッドが終了するのを待機
thread.join()
print("スレッドが終了しました")
これを分解してみましょう:
-
threading
モジュールをインポートし、スレッドを操作するためのツールを提供します。 - 簡単な関数
print_numbers()
を定義し、0から4までの数字を印刷し、各印刷の間に1秒の遅延を挿入します。 -
threading.Thread()
を使用してスレッドを作成し、関数をtarget
として指定します。 -
thread.start()
でスレッドを開始します。 - メインプログラムは引き続き実行され、 "メインスレッドは引き続き実行されます"と印刷します。
-
thread.join()
を使用して、スレッドが終了するのを待ってから次に進みます。
これを実行すると、"メインスレッドは引き続き実行されます"が即座に印刷され、背景で数字が印刷されていることがわかります。これがスレッドの力です!
スレッドクラスを拡張してスレッドを作成
スレッドを作成するもう一つの方法は、Thread
クラスを拡張することです。この方法は、再利用可能なスレッドオブジェクトを作成したい場合に役立ちます。以下はその例です:
import threading
import time
class NumberPrinter(threading.Thread):
def __init__(self, name):
threading.Thread.__init__(self)
self.name = name
def run(self):
for i in range(5):
print(f"{self.name}: Number {i}")
time.sleep(1)
# 2つのスレッドを作成
thread1 = NumberPrinter("Thread 1")
thread2 = NumberPrinter("Thread 2")
# スレッドを開始
thread1.start()
thread2.start()
print("メインスレッドは引き続き実行されます")
# 両方のスレッドが終了するのを待機
thread1.join()
thread2.join()
print("両方のスレッドが終了しました")
この例では:
-
NumberPrinter
クラスを定義し、threading.Thread
を拡張します。 -
__init__
メソッドをオーバーライドして、スレッドの名前を受け取ります。 -
run
メソッドをオーバーライドして、スレッドが開始されたときに呼び出されます。 -
NumberPrinter
クラスの2つのインスタンスを作成し、開始します。 - 両方のスレッドが同時に実行され、数字を印刷します。
この方法は、スレッドに対するより多くの制御を提供し、簡単に複数のインスタンスを作成できます。
start_new_thread()関数を使ってスレッドを作成
Pythonでスレッドを作成する3つ目の方法は、_thread
モジュールのstart_new_thread()
関数を使用することです。しかし、この方法は低レベルであり、ほとんどの用途では推奨されません。以下は完全性のための例です:
import _thread
import time
def print_numbers(thread_name):
for i in range(5):
print(f"{thread_name}: Number {i}")
time.sleep(1)
# 2つの新しいスレッドを開始
try:
_thread.start_new_thread(print_numbers, ("Thread 1",))
_thread.start_new_thread(print_numbers, ("Thread 2",))
except:
print("エラー:スレッドを開始できません")
# メインスレッドを生き続ける
time.sleep(6)
print("メインスレッドは終了します")
この方法は、前述の方法に比べて柔軟性が低く、制御が少なく、スレッドが完了するのを待つのが難しいアプローチです。
スレッド作成方法の比較
以下は、私たちが議論した3つの方法の簡単な比較です:
方法 | 利点 | 欠点 |
---|---|---|
関数を使用 | 実装が簡単、一時的なタスクに適している | 再利用性が低く、制御が少ない |
スレッドクラスを拡張 | 再利用可能、より多くの制御、オブジェクト指向 | 設定が少し複雑 |
start_new_thread() | 低レベルの制御 | 管理が難しい、柔軟性が低く、推奨されない |
結論
おめでとうございます!Pythonでのスレッドの世界に踏み込む第一歩をお取りでした。3つの異なる方法でスレッドを作成する方法をカバーしました。それぞれの利点と使用例について理解しておきましょう。スレッドはプログラムをより効率的にするだけでなく、複雑さを導入することもあります。Pythonの旅を続ける中で、スレッドをどのように効果的に使用するかをもっと学ぶことができます。
練習を続けることで、熟練したプログラマーのようにスレッドを使うことができるようになります。楽しいコーディングを!
Credits: Image by storyset