Skip to content

Instantly share code, notes, and snippets.

@fortune
Last active February 3, 2023 11:43
Show Gist options
  • Save fortune/2f1a3185d7a08f767c4a0b387ecccef3 to your computer and use it in GitHub Desktop.
Save fortune/2f1a3185d7a08f767c4a0b387ecccef3 to your computer and use it in GitHub Desktop.
multiprocessing モジュールのキューを使ったプロセス間通信のサンプルコード

multiprocessing モジュールのキューを使ったプロセス間通信のサンプルコード

Process(target=worker, daemon=False)
Process(target=worker, daemon=True)

の違いについてだが、False だと親プロセスはこの Process の終了を待つ。この場合でも親プロセスにシグナルを送って直ちに終了させることはできる。 その場合、子プロセスである Process はそのまま残る。True だと親プロセスが終了するときにこのデーモンプロセスも終了させようとする。 しかし、親プロセスをシグナルで終了させた場合、デーモンを終了させる間もなく終了させられるので、子プロセスである Process はそのまま残る。

"""
multiprocessing モジュールのキューを使ってプロセス間の通信をするサンプルコード
メインプロセスで皿洗いのタスクを一皿ずつこなしていき、一枚洗い終えるごとに
それをキューに突っ込んでいく。
乾燥担当の2つのプロセスがキューから一枚ずつ皿を取り出して乾燥させる。
キューが空になったら終了する。
"""
import multiprocessing as mp
import time
import os
def washer(dishes, output):
for dish in dishes:
print('Washing', dish, 'dish')
time.sleep(1)
output.put(dish) # キューにタスクを突っ込む
def dryer(input):
while True:
dish = input.get() # キューからタスクを取り出す
print('pid: {}, Drying {} dish'.format(os.getpid(), dish))
time.sleep(2)
input.task_done() # タスクの処理が終わったら、それをキューに伝える。
# 標準ライブラリの queue モジュールの Queue を模倣したマルチプロセス対応のキュー
dish_queue = mp.JoinableQueue()
# daemon プロセスとして乾燥担当プロセスを作成する。
# これにより親プロセスであるメインプロセスはこれらの終了を待つことなく終了し、同時にこれらのデーモンプロセスも終了させられる。
# こうしておかないと、これらのプロセスは無限ループになっているのでプログラムが終了しないだろう。
dryer_proc_1 = mp.Process(target=dryer, args=(dish_queue,), daemon=True)
dryer_proc_2 = mp.Process(target=dryer, args=(dish_queue,), daemon=True)
dryer_proc_1.start()
dryer_proc_2.start()
dishes = ['salad', 'bread', 'entree', 'dessert', 'chicken', 'pork', 'beaf', 'rice']
washer(dishes, dish_queue)
# キューが空になるのを待つ。空になったら戻ってくる。
dish_queue.join()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment