先日書いた「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