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が取り合いになっている。とりあえず負荷が軽い行為であれば、並列数を上げることは問題なさそう。