0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Python mupltiprocessing 勉強してみた

Posted at

初めに

並列処理について以下のドキュメントを参考に勉強してみました。
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])))

そこで以下のようにプリントログを書いてみました。

multi.py
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 を使用しないでプリントログを見てみました。

no_multi.py
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 だとどうなるのでしょうか。

multi_num_2.py
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 回目の処理が実行されていました。つまりワーカープロセス数とは、いくつ処理を並列で走らせるか、という数のようです。

まとめ

以下の点について調べました。

  • 並列処理と通常の処理の違い
  • ワーカープロセス数の意味

参考記事

0
1
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
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?