概要
多くの重い処理を分担して消費するための簡潔な実装をする。
multicoreを活用したいので、multiprocessing
を用いる。
内容
環境
macOS Catalina
Python 3.7.0
準備
from multiprocessing import Process, Queue
import sys
import time
import random
def reader_proc(name, queue):
while True:
msg = queue.get()
print(name, msg)
if (msg == 'DONE'):
break
time.sleep(random.randint(1, 4))
def writer(queue):
for i in range(3):
queue.put(i)
time.sleep(random.randint(1, 4))
queue.put('DONE')
queue.put('DONE')
queue = Queue()
reader1 = Process(target=reader_proc, args=('reader1', queue))
reader2 = Process(target=reader_proc, args=('reader2', queue))
reader_proc
:queueから読み取るが、消費に少し時間がかかる。
writer
:queueに追加してくれる。
実行
reader1.start()
reader2.start()
writer(queue)
reader1.join()
reader2.join()
output
reader1 0
reader2 1
reader1 2
reader2 DONE
reader1 DONE
蛇足
各所の説明では、いつ終わるか分からないQueueに未対応のものが多かった。
こうすれば、好きなタイミングで綺麗に終わらせられる。
'DONE'
が重要なデータでないか不安な場合は、以前書いた記事を参照すればすぐに解決する。
参考にさせていただいた本・頁
- https://stackoverflow.com/questions/11515944/how-to-use-multiprocessing-queue-in-python
- https://qiita.com/yo314159265/items/0215bb1f9128800fc7f0
感想
整理できて良かった。
今後
このシリーズはもう少し続けます。
追記: 続き記載しました。(https://qiita.com/yo314159265/items/aefd794a12c30f086413)