PythonでジョブをQueueにいれつつMulti Processでさばいていく方法

2017-12-20
このエントリーをはてなブックマークに追加

先日書いた「PythonでたまったQueueをMulti Threadでさばいていく方法」のMulti Process版

ProcessPoolExecutorではプロセス間で通信できないようだったのでmultiprocessingを使って書きました

import time
from datetime import datetime
from multiprocessing import Process, JoinableQueue


def worker(queue):
    while True:
        _job = queue.get()
        if _job is None:
            queue.task_done()
            break

        print(datetime.now())
        print(_job)
        queue.task_done()
        time.sleep(1)

def main():
    _process = []
    _queue = JoinableQueue()
    _docs = ["a", "b", "c", "d", "e", "f", "g"]
    for _i in range(2):
        _p = Process(target=worker, args=(_queue,))
        _p.start()
        _process.append(_p)

    for _d in _docs:
        _queue.put(_d)

    for _i in range(2):
        _queue.put(None)

    _queue.join()

if __name__ == "__main__":
    main()

思っていたよりマルチスレッド版とは違いが出ました

ジョブの投入が終わってからNoneを入れてるのは、「Noneっていうジョブが来たら終了してね」っていうサインを送ったっていう意図です、Queueが空になったくらいじゃ返ってきてくれません

2017-12-20 09:12:35.840879
a
2017-12-20 09:12:35.841184
b
2017-12-20 09:12:36.842196
c
2017-12-20 09:12:36.842427
d
2017-12-20 09:12:37.843443
e
2017-12-20 09:12:37.843636
f
2017-12-20 09:12:38.844696
g