初めに
並列処理について以下のドキュメントを参考に勉強してみました。
https://docs.python.org/ja/3/library/multiprocessing.html
並列処理と通常の処理の違い
まずは以下のコードを実行してみます。
from multiprocessing import Pool
def f(x):
return x * x
if __name__ == '__main__':
with Pool(5) as p:
print(p.map(f, [1, 2, 3]))
実行結果
[1, 4, 9]
これは以下のコードの処理と何が違うだろうと思いました。
def f(x):
return x * x
if __name__ == '__main__':
print(list(map(f, [1, 2, 3])))
そこで以下のようにプリントログを書いてみました。
from multiprocessing import Pool
import time
def f(x):
print('f is called.')
print('time sleep 3 seconds...')
for i in range(1, 4):
time.sleep(1)
print(f'--- {i} ---')
return x * x
if __name__ == '__main__':
with Pool(5) as p:
print(p.map(f, [1, 2, 3]))
print('end')
実行結果
f is called.
wait on 3 seconds...
f is called.
wait on 3 seconds...
f is called.
wait on 3 seconds...
--- 1 ---
--- 1 ---
--- 1 ---
--- 2 ---
--- 2 ---
--- 2 ---
--- 3 ---
--- 3 ---
--- 3 ---
[1, 4, 9]
3 秒間待機する処理が並列で動いています。つまり関数の実行が並列化されていました。
一方で multiprocessing
を使用しないでプリントログを見てみました。
import time
def f(x):
print('f is called.')
print('wait on 3 seconds...')
for i in range(1, 4):
time.sleep(1)
print(f'--- {i} ---')
return x * x
if __name__ == '__main__':
print(list(map(f, [1, 2, 3])))
実行結果
f is called.
wait on 3 seconds...
--- 1 ---
--- 2 ---
--- 3 ---
f is called.
wait on 3 seconds...
--- 1 ---
--- 2 ---
--- 3 ---
f is called.
wait on 3 seconds...
--- 1 ---
--- 2 ---
--- 3 ---
[1, 4, 9]
上記の出力の通り、合計 9 秒待機時間が発生しました。リストの各要素に対して、一つずつ関数が呼ばれています。
ワーカープロセス数
並列処理のコードで気になったのが、Pool(5)
の 5 です。なんの数字なのでしょうか。ドキュメントには以下のように記載されています。
processes は使用するワーカープロセスの数です。
プロセス数を変えて実行してみます。2 だとどうなるのでしょうか。
from multiprocessing import Pool
import time
def f(x):
print('f is called.')
print('wait on 3 seconds...')
for i in range(1, 4):
time.sleep(1)
print(f'--- {i} ---')
return x * x
if __name__ == '__main__':
with Pool(processes=2) as p:
print(p.map(f, [1, 2, 3]))
実行結果
f is called.
wait on 3 seconds...
f is called.
wait on 3 seconds...
--- 1 ---
--- 1 ---
--- 2 ---
--- 2 ---
--- 3 ---
f is called.
wait on 3 seconds...
--- 3 ---
--- 1 ---
--- 2 ---
--- 3 ---
[1, 4, 9]
関数 f
が 2 つ並列に動いています。1 つ目が終了した後、3 回目の処理が実行されていました。つまりワーカープロセス数とは、いくつ処理を並列で走らせるか、という数のようです。
まとめ
以下の点について調べました。
- 並列処理と通常の処理の違い
- ワーカープロセス数の意味
参考記事