import multiprocessing
import time
def worker(n):
print(f"プロセス {n} 開始")
time.sleep(2)
print(f"プロセス {n} 終了")
if __name__ == "__main__":
process_list = []
# 3つのプロセスを作成
for i in range(3):
p = multiprocessing.Process(target=worker, args=(i,))
process_list.append(p)
p.start()
# 全てのプロセスが終了するまで待機
for p in process_list:
p.join()
print("全プロセス終了")
1.4 マルチプロセスを使う際の注意点
1. Windowsでは if __name__ == "__main__": が必須
Windows環境では、multiprocessing.Process() を使う際に if __name__ == "__main__": を書かないとエラーが発生 します。
間違ったコード(エラーになる)
import multiprocessing
def worker():
print("Hello from process")
p = multiprocessing.Process(target=worker)
p.start()
このコードは Windowsではエラーが発生 します。
正しいコード
import multiprocessing
def worker():
print("Hello from process")
if __name__ == "__main__":
p = multiprocessing.Process(target=worker)
p.start()
p.join()
if __name__ == "__main__": を付けることで、Windowsでも正常に動作します。
import multiprocessing
def square(n):
return n * n
if __name__ == "__main__":
with multiprocessing.Pool(4) as pool:
results = pool.map(square, range(10))
print(results)
2.6 まとめ
multiprocessing モジュールを使うと 並列処理が簡単に実装できる
Process クラスで個別のプロセスを作成
Queue や Pipe を使うと プロセス間でデータを共有可能
Value や Array で メモリ共有
Pool クラスを使うと 大量のデータを効率的に処理
3. 応用編:エラーハンドリングとパフォーマンス最適化
3.1 multiprocessingで発生しやすいエラーと対策
エラー1:Windows環境での if __name__ == "__main__": 不在エラー
エラーメッセージ
RuntimeError: freeze_support() must be called if program is run in frozen mode
解決策
import multiprocessing
def worker():
print("Hello from process")
if __name__ == "__main__": # これが必要
p = multiprocessing.Process(target=worker)
p.start()
p.join()
エラー2:PicklingError(プロセス間で関数を渡せない)
エラーメッセージ
AttributeError: Can't pickle local object 'main.<locals>.<lambda>'
解決策
import multiprocessing
def square(x): # グローバル関数にする
return x * x
if __name__ == "__main__":
with multiprocessing.Pool(4) as pool:
results = pool.map(square, range(10)) # lambda を避ける
print(results)
import multiprocessing
def worker(n):
return n * n
if __name__ == "__main__":
with multiprocessing.Pool(multiprocessing.cpu_count()) as pool:
results = pool.map(worker, range(100))
print(results)
4.3 マルチプロセスで辞書やリストを共有する方法は?
回答
multiprocessing.Manager() を使う
import multiprocessing
def worker(shared_list):
shared_list.append(100) # 共有リストを更新
if __name__ == "__main__":
with multiprocessing.Manager() as manager:
shared_list = manager.list([1, 2, 3])
p = multiprocessing.Process(target=worker, args=(shared_list,))
p.start()
p.join()
print(shared_list) # [1, 2, 3, 100]