Pythonのmultiprocessingモジュール:並列処理の徹底ガイド【実例付き】
Pythonの並列処理を学び、プログラムのパフォーマンスを向上させましょう。
multiprocessingモジュールの基本
Pythonのmultiprocessing
モジュールを使用すると、CPUのコアをフル活用して効率的に並列処理を実現できます。
- GILの制約を回避し、真の並列処理を実現
- プロセス間でデータを共有する手段が提供される
- CPUバウンドのタスクに最適
multiprocessingの基本的な使い方
例1: 基本的な並列処理
from multiprocessing import Process
def worker():
print("ワーカーが実行されています!")
if __name__ == "__main__":
p = Process(target=worker)
p.start()
p.join()
例2: プロセスプールを使用
from multiprocessing import Pool
def square(n):
return n * n
if __name__ == "__main__":
with Pool(4) as p:
results = p.map(square, [1, 2, 3, 4, 5])
print(results)
例3: 共有メモリの使用
from multiprocessing import Value, Process
def increment(shared_value):
shared_value.value += 1
if __name__ == "__main__":
val = Value('i', 0)
p = Process(target=increment, args=(val,))
p.start()
p.join()
print(val.value)
例4: マルチプロセスでのロックの使用
from multiprocessing import Process, Lock
def worker(lock, num):
with lock:
print(f"プロセス {num} が実行されています!")
if __name__ == "__main__":
lock = Lock()
processes = [Process(target=worker, args=(lock, i)) for i in range(5)]
for p in processes:
p.start()
for p in processes:
p.join()
例5: マネージャーを使った共有リストの活用
from multiprocessing import Process, Manager
def worker(shared_list, value):
shared_list.append(value)
if __name__ == "__main__":
with Manager() as manager:
shared_list = manager.list()
processes = [Process(target=worker, args=(shared_list, i)) for i in range(5)]
for p in processes:
p.start()
for p in processes:
p.join()
print(list(shared_list))
multiprocessingの実務的な活用例
例1: 大量のデータを並列処理
from multiprocessing import Pool
import time
def compute(x):
time.sleep(1)
return x * x
if __name__ == "__main__":
with Pool(4) as p:
results = p.map(compute, range(10))
print(results)
例2: キューを利用したプロセス間通信
from multiprocessing import Process, Queue
def worker(q):
q.put("データ送信")
if __name__ == "__main__":
q = Queue()
p = Process(target=worker, args=(q,))
p.start()
print(q.get())
p.join()
例3: 並列Webスクレイピング
from multiprocessing import Pool
import requests
def fetch_url(url):
response = requests.get(url)
return url, response.status_code
if __name__ == "__main__":
urls = ["https://example.com" for _ in range(5)]
with Pool(5) as p:
results = p.map(fetch_url, urls)
print(results)
例4: 画像処理の並列化
from multiprocessing import Pool
from PIL import Image
def process_image(image_path):
img = Image.open(image_path)
img = img.convert("L")
img.save("processed_" + image_path)
if __name__ == "__main__":
image_files = ["image1.jpg", "image2.jpg", "image3.jpg"]
with Pool(3) as p:
p.map(process_image, image_files)
例5: データベースクエリの並列実行
from multiprocessing import Pool
import sqlite3
def fetch_data(query):
conn = sqlite3.connect("example.db")
cursor = conn.cursor()
cursor.execute(query)
result = cursor.fetchall()
conn.close()
return result
if __name__ == "__main__":
queries = ["SELECT * FROM users", "SELECT * FROM orders"]
with Pool(2) as p:
results = p.map(fetch_data, queries)
print(results)
次に読むべき記事
まとめ
Pythonのmultiprocessing
モジュールを活用することで、並列処理を容易に実装し、プログラムのパフォーマンスを最大化できます。
さらにPythonを学びたい方は、以下の記事もチェック!
Python完全ガイドを見る
コメント