2016年08月13日

pythonのjoblibでコア数以上の並列が可能か確認する

sleepさせながら行う処理を100個ほど立ち上げたかったので、4コアのマシン上でちゃんとプロセスが100個並列で立ち上がってくれるか、それともどっかで頭打ちしてしまうのか確認する。

下記はn_jobsを4に指定している。

import time
import joblib

def print_thread_number(thread_number):
    for i in range(3):
        print(thread_number, i)
        time.sleep(1)

joblib.Parallel(n_jobs=4)(joblib.delayed(print_thread_number)(i) for i in range(10))

結果

0 0
1 0
2 0
3 0
0 1
1 1
2 1
3 1
0 2
1 2
3 2
2 2
4 0
5 0
6 0
7 0
4 1
7 1
5 1
6 1
4 2
7 2
5 2
6 2
8 0
9 0
8 1
9 1
8 2
9 2

n_jobsで指定した4個ずつ、きちんと消化されている。

n_jobsを10にすると、10個まとめて実行される。コア数を多少超えても大丈夫なようだ。

0 0
1 0
2 0
3 0
4 0
5 0
6 0
7 0
8 0
9 0
0 1
4 1
1 1
3 1
2 1
5 1
6 1
7 1
9 1
8 1
0 2
4 2
1 2
3 2
2 2
5 2
6 2
7 2
9 2
8 2

100並列とかにしても問題なかった。

処理能力をしっかり食う処理を並列で実行させた場合はどうなるか。下記は重い処理を20並列でやらせた際のtop。

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+   COMMAND
 5862 user    20   0  185448  22452   4004 R  21.6  0.1   0:01.62 python
 5871 user    20   0  185448  22792   4320 R  21.6  0.1   0:01.60 python
 5866 user    20   0  185448  22780   4320 R  20.9  0.1   0:01.57 python
 5863 user    20   0  185448  22452   4004 R  19.6  0.1   0:01.57 python
 5865 user    20   0  185448  22776   4320 R  19.6  0.1   0:01.54 python
 5858 user    20   0  185448  22760   4320 R  19.3  0.1   0:01.50 python
 5870 user    20   0  185448  22788   4320 R  19.3  0.1   0:01.54 python
 5872 user    20   0  185448  22792   4320 R  19.3  0.1   0:01.50 python
 5859 user    20   0  185448  22700   4256 R  18.9  0.1   0:01.51 python
 5860 user    20   0  185448  22576   4128 R  18.9  0.1   0:01.53 python
 5864 user    20   0  185448  22452   4004 R  18.9  0.1   0:01.55 python
 5868 user    20   0  185448  22788   4320 R  18.9  0.1   0:01.51 python
 5869 user    20   0  185448  22788   4320 R  18.9  0.1   0:01.50 python
 5873 user    20   0  185448  22568   4096 R  18.9  0.1   0:01.49 python
 5874 user    20   0  185448  22568   4096 R  18.9  0.1   0:01.51 python
 5876 user    20   0  185448  22800   4320 R  18.9  0.1   0:01.48 python
 5857 user    20   0  185448  22760   4320 R  18.6  0.1   0:01.53 python
 5861 user    20   0  185448  22448   4004 R  18.6  0.1   0:01.50 python
 5867 user    20   0  185448  22788   4320 R  18.6  0.1   0:01.52 python
 5875 user    20   0  185448  22608   4128 R  18.6  0.1   0:01.48 python          

綺麗にCPUが取り合いになっている。とりあえず負荷が軽い行為であれば、並列数を上げることは問題なさそう。