Pythonのマルチスレッドを活用することで、複数の処理を並行して実行し、プログラムのパフォーマンスを向上させることが可能です。
この記事では、Pythonのマルチスレッドの基本的な使い方から、効率的な活用方法までを解説します。
- 未経験者向けプログラミングスクール
- 現役エンジニアがしっかりサポート
- 卒業後も安心の転職・副業サポート
Pythonでのマルチスレッドの基本

Pythonでマルチスレッドを利用することで、複数のタスクを同時に実行できます。
マルチスレッドは、特にI/O操作やネットワーク通信など、待機時間の長い処理を効率化する際に役立ちます。
threadingモジュールの基本的な使い方
Pythonでマルチスレッドを実現するには、標準ライブラリのthreadingモジュールを使用します。
import threading
def print_numbers():
for i in range(5):
print(i)
# スレッドの作成
thread = threading.Thread(target=print_numbers)
thread.start()
thread.join() # スレッドの終了を待機
このコードでは、threading.Threadを使って新しいスレッドを作成し、joinでスレッドの終了を待機しています。
複数スレッドを同時に実行する
複数のスレッドを同時に実行することで、複数のタスクを並行して処理できます。
次のコードでは、2つのスレッドを作成して、それぞれ別々のタスクを並行して実行します。
import threading
def task1():
print("Task 1")
def task2():
print("Task 2")
thread1 = threading.Thread(target=task1)
thread2 = threading.Thread(target=task2)
thread1.start()
thread2.start()
thread1.join()
thread2.join()
この例では、2つのスレッドが同時に実行され、それぞれのタスクが並行して処理されます。
スレッドの同期とロック
マルチスレッドを使う際に重要なことは、複数のスレッドが同じリソースにアクセスする場合の同期です。
Pythonでは、Lockオブジェクトを使ってスレッド間での競合を防ぎます。
import threading
lock = threading.Lock()
counter = 0
def increment():
global counter
with lock: # ロックを取得して同期
counter += 1
threads = []
for i in range(5):
thread = threading.Thread(target=increment)
threads.append(thread)
thread.start()
for thread in threads:
thread.join()
print(counter)
このコードでは、withステートメントを使ってlockを取得し、counterの値を安全にインクリメントしています。
- 現役エンジニアからスキルを学べる
- 満足度は驚異の97.4%
- 300社以上のIT企業で研修に導入
- 毎日9時〜21時まで、無料カウンセリングを開催中!
Pythonでのマルチプロセッシングとマルチスレッディングの違い

Pythonでは、マルチプロセッシングとマルチスレッディングの2つの並行処理方法があります。
ここでは、それぞれの違いと、適切な選択方法について解説します。
マルチスレッドの利点と欠点
マルチスレッドは、メモリ共有が容易で、スレッド間でのデータ通信が簡単に行えます。
しかし、PythonのGIL(グローバルインタプリタロック)により、CPUバウンドなタスクの並列処理には適していません。
import threading
def cpu_bound_task():
total = 0
for i in range(10000000):
total += i
print(total)
thread1 = threading.Thread(target=cpu_bound_task)
thread2 = threading.Thread(target=cpu_bound_task)
thread1.start()
thread2.start()
thread1.join()
thread2.join()
このコードでは、GILの影響で、スレッドの数が増えてもCPUバウンドタスクの効率は向上しません。
マルチプロセッシングの利点
マルチプロセッシングは、GILの制約を受けないため、CPUバウンドなタスクにはマルチスレッドよりも効果的です。
Pythonでは、multiprocessingモジュールを使用してプロセス間での並行処理を実現できます。
import multiprocessing
def cpu_bound_task():
total = 0
for i in range(10000000):
total += i
print(total)
process1 = multiprocessing.Process(target=cpu_bound_task)
process2 = multiprocessing.Process(target=cpu_bound_task)
process1.start()
process2.start()
process1.join()
process2.join()
この例では、multiprocessingを使ってCPUバウンドタスクを並列に実行しています。
使い分けのポイント
I/Oバウンドタスクにはマルチスレッドを、CPUバウンドタスクにはマルチプロセッシングを選択することが推奨されます。
Pythonのスレッドプールを使った効率的な並列処理

Pythonのスレッドプールを使用することで、複数のスレッドを効率的に管理し、並列処理を最適化できます。
ここでは、ThreadPoolExecutorを使ったスレッドプールの活用方法を解説します。
ThreadPoolExecutorの基本的な使い方
concurrent.futuresモジュールのThreadPoolExecutorを使うことで、簡単にスレッドプールを作成し、タスクを並列に処理できます
。
from concurrent.futures import ThreadPoolExecutor
def task(message):
print(message)
with ThreadPoolExecutor(max_workers=3) as executor:
executor.submit(task, "Task 1")
executor.submit(task, "Task 2")
executor.submit(task, "Task 3")
このコードでは、3つのタスクがスレッドプールによって並行して実行されます。
スレッドプールによるリソースの最適化
スレッドプールを使用することで、スレッドの生成と破棄によるオーバーヘッドを抑え、効率的にリソースを管理できます。
タスクの結果を取得する
submitメソッドを使ってスレッドプールでタスクを実行した場合、その結果をfutureオブジェクトで取得することができます。
from concurrent.futures import ThreadPoolExecutor
def task(n):
return n * n
with ThreadPoolExecutor() as executor:
future = executor.submit(task, 5)
result = future.result()
print(result)
この例では、タスクの結果をfuture.result()で取得しています。
プログラミングスクール受講時には教育訓練給付制度を利用することで、受講料の最大80%の給付を受けることが可能です。
まとめ:Pythonでマルチスレッドを効率的に活用しよう

Pythonのマルチスレッドを適切に活用することで、プログラムのパフォーマンスを向上させ、並列処理を効率的に行うことができます。
この記事で紹介した方法を参考にして、Pythonでのマルチスレッドプログラミングを活用しましょう。



コメント