Python - スレッドの作成

こんにちは、Pythonプログラマー志望の皆さん!今日は、スレッドの興味深い世界に飛び込んでいきましょう。スレッドについて聞いたことがないという方も心配しないでください。私たちは最初から始め、少しずつ進んでいきます。このチュートリアルの最後には、プロのようにスレッドを作成できるようになる予定です!

Python - Creating a Thread

スレッドとは?

スレッドを作成する前に、まず何がスレッドであるかを理解しましょう。複雑な料理を作るときを想像してみてください。すべてを一つずつではなく、パスタを一つのボイラーで沸騰させながら、もう一つの場所で野菜を切っていることもあります。これは、プログラミングの中でのスレッドの仕組みに似ています。スレッドは、プログラムの異なる部分を同時に実行させ、コードをより効率的にします。

関数を使ってスレッドを作成

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("スレッドが終了しました")

これを分解してみましょう:

  1. threadingモジュールをインポートし、スレッドを操作するためのツールを提供します。
  2. 簡単な関数print_numbers()を定義し、0から4までの数字を印刷し、各印刷の間に1秒の遅延を挿入します。
  3. threading.Thread()を使用してスレッドを作成し、関数をtargetとして指定します。
  4. thread.start()でスレッドを開始します。
  5. メインプログラムは引き続き実行され、 "メインスレッドは引き続き実行されます"と印刷します。
  6. 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("両方のスレッドが終了しました")

この例では:

  1. NumberPrinterクラスを定義し、threading.Threadを拡張します。
  2. __init__メソッドをオーバーライドして、スレッドの名前を受け取ります。
  3. runメソッドをオーバーライドして、スレッドが開始されたときに呼び出されます。
  4. NumberPrinterクラスの2つのインスタンスを作成し、開始します。
  5. 両方のスレッドが同時に実行され、数字を印刷します。

この方法は、スレッドに対するより多くの制御を提供し、簡単に複数のインスタンスを作成できます。

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