一つの関数に引数をとって、引数の値によって並列処理させる方法は良い記事がたくさんでてきます。
ただ、開発する中で既に定義されている、引数を取らない複数の関数を並列処理する方法があまりでてこなかったので(ユースケースが少ないのかもひしれませんが)、まとめてみます
コードはGithubにもあがっています
今回並列処理にjoblibを用いているので、install済でない方はinstallしておきましょう
pip install joblib
まずは複数の関数をただ順番に実行していく関数の定義です。
def run_func(*funcs):
[f() for f in funcs]
次に、この関数を並列処理させます。
from joblib import Parallel, delayed
def parallel_process_func(*target_funcs):
Parallel(n_jobs=-1)([delayed(run_func)(func) for func in target_funcs])
n_jobsは同時処理数で、-1のときはできるだけマシンのコアを使って並列処理させます。たとえば3にすれば3並列処理となります。
以上で完了です。実際に動かしてみましょう。
def x():
print('-- x() START --')
[i for i in range(10000000)]
print('-- x() END --')
def y():
print('-- y() START --')
[i for i in range(10000000)]
print('-- y() END --')
parallel_process_func(x, y)
実行すると以下のような出力となるはずです。
-- x() START --
-- y() START --
-- x() END --
-- y() END --
並列処理されてますね。
定義したparallel_process_func関数に、関数名をただ渡していけばいいだけなので使い勝手も悪くなさそうです