この記事では、Pythonでのマルチスレッディングとマルチプロセッシングについて解説します。具体的なコード例とその解説、応用例を含めています。
目次
はじめに:マルチスレッディングとマルチプロセッシングの違い
マルチスレッディングとマルチプロセッシングは両方とも、プログラムの処理を効率よく行うための手法です。しかし、それぞれには特定の利点と制限があります。
マルチスレッディング
マルチスレッディングは、一つのプロセス内で複数のスレッドを同時に動かすことです。メモリを共有するため、リソースの効率が良いですが、GIL(Global Interpreter Lock)によって、Pythonの場合、実際には並列処理が難しい場合があります。
マルチプロセッシング
一方、マルチプロセッシングは、複数のプロセスを同時に動かすことです。各プロセスが独自のメモリ空間を持つため、GILの制限を受けませんが、メモリ使用量が増えるデメリットがあります。
基本的なコード例
ここでは、Pythonでのマルチスレッディングとマルチプロセッシングの基本的なコード例を示します。
マルチスレッディングの基本的なコード例
from threading import Thread
import time
# 関数を定義
def print_numbers():
for i in range(10):
time.sleep(1)
print(i)
# スレッドを作成
thread = Thread(target=print_numbers)
# スレッドを開始
thread.start()
# スレッドが終了するのを待つ
thread.join()
このコードでは、`Thread` クラスを使用してマルチスレッディングを実装しています。`print_numbers`関数を非同期で実行するスレッドを作成し、そのスレッドを開始しています。
マルチプロセッシングの基本的なコード例
from multiprocessing import Process
import time
# 関数を定義
def print_numbers():
for i in range(10):
time.sleep(1)
print(i)
# プロセスを作成
process = Process(target=print_numbers)
# プロセスを開始
process.start()
# プロセスが終了するのを待つ
process.join()
このコードでは、`Process` クラスを使用してマルチプロセッシングを実装しています。`print_numbers`関数を非同期で実行するプロセスを作成し、そのプロセスを開始しています。
応用例
ここでは、実際に役立つ応用例を2つご紹介します。
マルチスレッディングでのウェブスクレイピング
from threading import Thread
import requests
# URLリスト
urls = ['http://example.com/page1', 'http://example.com/page2']
# スクレイピングする関数
def fetch_content(url):
response = requests.get(url)
print(f"Content from {url}: {response.text[:100]}")
# スレッドを作成して実行
threads = []
for url in urls:
thread = Thread(target=fetch_content, args=(url,))
thread.start()
threads.append(thread)
# 全てのスレッドが終了するのを待つ
for thread in threads:
thread.join()
マルチプロセッシングでのデータ分析
from multiprocessing import Pool
import numpy as np
# 関数を定義
def calculate_mean(array):
return np.mean(array)
# データ
data = [np.random.rand(1000) for _ in range(10)]
# プロセスプールを作成
with Pool() as pool:
means = pool.map(calculate_mean, data)
print(means)
まとめ
Pythonでのマルチスレッディングとマルチプロセッシングには、それぞれ利点と制限があります。用途や必要なリソースに応じて、適切な手法を選ぶことが重要です。
コメント