Pythonのマルチプロセスプール

Python学習【365日チャレンジ!】220日目のマスターU(@Udemy11)です。

自民党総裁選も終了し、新しい自民党の幹部が決まったらしいですが、平均年齢が71.4歳で、女性不在というところに昭和感がにじみ出ているのを感じるのは私だけでしょうか?

いろいろな問題を有耶無耶にして、なかったことのようになっていくのかと思うと、国民が政治に関心がなくなっていくのもうなずけます。

ちなみに71歳と言ったら通常定年退職している年齢なのに、日本を動かしてるいるのがそんなおじいさんばかりって、いったいこの国はどうなってるんでしょうね。

こんな老害を吹き飛ばしてくれる若い政治家はいないんでしょうか?

ということで、今日もPython学習をはじめましょう。

昨日の復習

昨日は、プールを使用した非同期処理を学習しました。

非同期処理は、関数の処理を始めたあと、その処理は一旦横においといて、他の処理をしたあと、最初の関数の処理を終わらせるというような仕組みですが、プロセスのPoolを使って非同期処理を実行しました。

詳細については、昨日の記事をごらんください。

今日は、ワーカープロセスの数を制限した非同期処理について学習します。

引数で制限

昨日は、プロセスを1つだけ作ったので、Poolの引数を1にしましたが、今回は、プロセスを2つ作ってみます。

import logging
import multiprocessing
import time

logging.basicConfig(
    level=logging.DEBUG, format='%(processName)s: %(message)s'
)

def worker1(i):
    logging.debug('start')
    time.sleep(5)
    logging.debug('end')
    return i

if __name__ == '__main__':
    with multiprocessing.Pool(1) as p:
        p1 = p.apply_async(worker1, (100, ))
        p2 = p.apply_async(worker1, (200, ))
        logging.debug('executed')
        logging.debug(p1.get())
        logging.debug(p2.get())

17行目までは昨日と同じコードです。

16行目でwithステートメントでPoolを開いていますが、引数も昨日と同じように1にしています。

18行目でもう一つ非同期処理のプロセスp2を作成して、ターゲットをworker1、引数を200に定義しています。

19行目、20行目は同じで、21行目を追加しています。

実行結果

MainProcess: executed
ForkPoolWorker-1: start #このあとの行は、5秒後に出力される
ForkPoolWorker-1: end
ForkPoolWorker-1: start
MainProcess: 100
ForkPoolWorker-1: end
MainProcess: 200

実行結果は、並列処理がされずに、一つづつプロセスが処理されてプログラムが終了します。

プロセスを追加して並列処理をしようとしているのに、16行目のPoolの引数が1になっているので、Poolで実行できるプロセスの数を制限しているために、p2は並列処理ができずに、1つ目のプロセスが終了したあとで実行されるわけですね。

引数を修正

今日追加したコードを正しく並列処理するには、16行目のmultiprocess.Pool(1)の引数を2以上にすると追加したコードも問題なく並列処理されます。

実行結果

MainProcess: executed
ForkPoolWorker-1: start
ForkPoolWorker-2: start #このあとの行は、5秒後に出力される
ForkPoolWorker-1: end
ForkPoolWorker-2: end
MainProcess: 100
MainProcess: 200

先程は、ForkPoolWorker-1だけだったのが、ForkPoolWorker-2も作成されているのがわかるかと思います。

一歩一歩

一気に色々と勉強してしまうと、頭が飽和状態になってあれもこれも覚えることはできませんが、一つだけだとなんとなく覚えられそうな気がしませんか?

とはいえ、復習をせずにほっておくと、エビングハウスの忘却曲線のとおり、忘れていく一方です。

何度かお伝えしていますが、「1日一歩、3日で3歩、3歩歩いて2歩下がる」くらいの気持ちでコツコツと前に進んでいくのが意外と近道かもしれませんよ。

それでは明日もGood Python!