Python multiprocessing ライブラリ完全ガイド
Python 標準ライブラリの multiprocessing は、マルチプロセスを活用して並列処理を実現するためのツールを提供します。本記事では、multiprocessing の主要な機能とその活用方法について詳しく解説します。
1. multiprocessing ライブラリの概要
multiprocessingは、複数のプロセスを並列に実行するための標準ライブラリです。threadingと異なり、multiprocessingは GIL (Global Interpreter Lock) の制約を受けません。- CPU バウンドのタスク(数値計算、データ処理など)に適しています。
インストール方法
multiprocessing は Python の標準ライブラリなので、追加のインストールは不要です。
import multiprocessing
import multiprocessing
import time
def worker():
print("プロセス開始")
time.sleep(2)
print("プロセス終了")
if __name__ == "__main__":
process = multiprocessing.Process(target=worker)
process.start()
process.join()
import multiprocessing
def square(n):
return n * n
if __name__ == "__main__":
with multiprocessing.Pool(processes=4) as pool:
results = pool.map(square, range(10))
print(results)
import multiprocessing
def worker(q):
q.put("データ送信")
if __name__ == "__main__":
q = multiprocessing.Queue()
process = multiprocessing.Process(target=worker, args=(q,))
process.start()
process.join()
print("受信したデータ:", q.get())
import multiprocessing
def worker(val):
val.value += 1
if __name__ == "__main__":
val = multiprocessing.Value("i", 0)
process = multiprocessing.Process(target=worker, args=(val,))
process.start()
process.join()
print("更新後の値:", val.value)
import multiprocessing
import time
def worker(lock):
with lock:
print("ロック取得")
time.sleep(1)
print("ロック解放")
if __name__ == "__main__":
lock = multiprocessing.Lock()
processes = [multiprocessing.Process(target=worker, args=(lock,)) for _ in range(3)]
for p in processes:
p.start()
for p in processes:
p.join()
import multiprocessing
def worker(shared_list):
shared_list.append("データ追加")
if __name__ == "__main__":
with multiprocessing.Manager() as manager:
shared_list = manager.list()
process = multiprocessing.Process(target=worker, args=(shared_list,))
process.start()
process.join()
print("共有リスト:", list(shared_list))
import multiprocessing
import time
event = multiprocessing.Event()
def worker():
print("待機中...")
event.wait()
print("実行開始!")
if __name__ == "__main__":
process = multiprocessing.Process(target=worker)
process.start()
time.sleep(2)
event.set()
process.join()
import multiprocessing
import time
semaphore = multiprocessing.Semaphore(2)
def worker(n):
with semaphore:
print(f"プロセス {n} 開始")
time.sleep(2)
print(f"プロセス {n} 終了")
if __name__ == "__main__":
processes = [multiprocessing.Process(target=worker, args=(i,)) for i in range(5)]
for p in processes:
p.start()
for p in processes:
p.join()
import multiprocessing
import time
barrier = multiprocessing.Barrier(3)
def worker(n):
print(f"プロセス {n} 待機中...")
barrier.wait()
print(f"プロセス {n} 実行開始")
if __name__ == "__main__":
processes = [multiprocessing.Process(target=worker, args=(i,)) for i in range(3)]
for p in processes:
p.start()
for p in processes:
p.join()
import multiprocessing
def worker():
print("プロセス ID:", multiprocessing.current_process().pid)
if __name__ == "__main__":
process = multiprocessing.Process(target=worker)
process.start()
process.join()