jobidのParallelを使うと便利らしい
$ sudo pip install joblib
# コアの数の取り方
import multiprocessing
core_count = multiprocessing.cpu_count()
# とりあえずコアの半分だけ使おうか
job_count = int(core_count / 2)
# 行う処理
def foo( i ):
return i ** 2
# 並列実行
import joblib
joblib.Parallel(n_jobs=job_count)(joblib.delayed(foo)(i) for i in range(10))
#=> [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
実に簡単。
ところで並列で処理した結果をlistにappendするとかは大丈夫だろうか。
Pythonのlist appendはthread-safeらしいことを書いてあるけど、下記のようなコードはアカンらしい。
lst = []
def foo( i ):
lst.append(i)
print(lst)
# 並列実行
import joblib
joblib.Parallel(n_jobs=4)(joblib.delayed(foo)(i) for i in range(10))
# => [0]
# => [1]
# => [2]
# => [3]
# => [0, 4]
# => [1, 5]
# => [2, 6]
# => [0, 4, 7]
# => [2, 6, 8]
# => [2, 6, 8, 9]
まあ、こういう使い方はしなくてもいいようにちゃんと書こう。