56 コアのマシンでプロセス プール エグゼキューターを使用して並列インスタンスをトリガーすると、Python スクリプトの実行時間が長くなることがわかります。スクリプト abc.py は、約 1 秒かかる重い Python ライブラリをインポートします。
time python ~/abc.py
real 0m0.846s
user 0m0.620s
sys 0m0.078s
試験方法
import shlex
from subprocess import Popen, PIPE
def test():
command = "python /u/deeparora/abc.py"
p = Popen(shlex.split(command), stdout=PIPE, stderr=PIPE)
p.wait(timeout=None)
以下のコードも予想される 1 秒かかります
シリアル実行
import concurrent.futures
pool = ProcessPoolExecutor(max_workers=1)
futures = []
for index in range(0, 1):
futures.append(pool.submit(test))
for future in concurrent.futures.as_completed(futures):
pass
ただし、以下のコードは 56 コアのマシンで実行するのに 5 秒かかります。
並列実行
import concurrent.futures
pool = ProcessPoolExecutor(max_workers=50)
futures = []
for index in range(0, 50):
futures.append(pool.submit(test))
for future in concurrent.futures.as_completed(futures):
pass
プロセス ログで実行時間を確認したところ、スクリプト (abc.py) の実行時間も 1 秒から 4 秒に増加したことがわかりました。誰かがこの動作を理解するのを手伝ってくれますか?