2020/09/25 バグがあったので追記
単純に複数CPUを使ってみる
ALL about Linux: お手軽なベンチマークあれこれ
$ time for ((i=0;++i<1000000;)); do :; done
real 0m4.698s
user 0m4.663s
sys 0m0.000s
a.py
import multiprocessing
import time
import subprocess
class CmdProc(multiprocessing.Process):
def __init__(self, number):
super().__init__()
self.number = number
def run(self):
subprocess.run("for ((i=0;++i<{};)); do :; done".format(self.number), shell=True)
return
def main():
procs = []
for number in [1000000, 1000000]: # 上記コマンドを2個並列実行
proc = CmdProc(number)
proc.start()
procs.append(proc)
for proc in procs:
proc.join()
if __name__ == '__main__':
main()
起動コストからしてこれぐらいで妥当
$ time python3 a.py
real 0m4.909s
user 0m9.416s
sys 0m0.012s
b.py
import multiprocessing
import subprocess
from multiprocessing import Pool
def cmd_proc(number):
subprocess.run("for ((i=0;++i<{};)); do :; done".format(number), shell=True)
def main():
n_cores = multiprocessing.cpu_count()
p = Pool(n_cores)
res = p.map(cmd_proc, [1000000, 1000000])
if __name__ == '__main__':
main()
$ time python3 b.py
real 0m4.894s
user 0m9.398s
sys 0m0.029s
2020/09/25 追記
さて、b.py
には重大なバグが存在する。このように書き換えてプロセスを見ると・・・・
b_loop.py
import multiprocessing
import subprocess
from multiprocessing import Pool
import time
def cmd_proc(number):
subprocess.run("for ((i=0;++i<{};)); do :; done".format(number), shell=True)
def main():
n_cores = multiprocessing.cpu_count()
p = Pool(n_cores)
res = p.map(cmd_proc, [1000000, 1000000])
print("OK")
while True:
time.sleep(1)
if __name__ == '__main__':
main()
終わっていない。
$ python3 b_loop.py &
OK
$ ps awx | grep b_loop.py | grep -v grep
83031 pts/0 Sl 0:00 python3 b_loop.py
83032 pts/0 S 0:00 python3 b_loop.py
83033 pts/0 S 0:00 python3 b_loop.py
withでcloseする必要がある。
b_loop_fix.py
import multiprocessing
import subprocess
from multiprocessing import Pool
import time
def cmd_proc(number):
subprocess.run("for ((i=0;++i<{};)); do :; done".format(number), shell=True)
def main():
n_cores = multiprocessing.cpu_count()
with Pool(processes=n_cores) as p:
res = p.map(cmd_proc, [1000000, 1000000])
print("OK")
while True:
time.sleep(1)
if __name__ == '__main__':
main()
$ python3 b_loop_fix.py &
OK
$ ps awx | grep b_loop_fix.py | grep -v grep
83170 pts/0 S+ 0:00 python3 b_loop_fix.py