LoginSignup
0
0

More than 3 years have passed since last update.

単純な並列処理①消費に時間がかかる時 (Python; multiprocessing.Queue)

Last updated at Posted at 2021-03-02

概要

多くの重い処理を分担して消費するための簡潔な実装をする。

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://qiita.com/yo314159265/items/aefd794a12c30f086413)

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0