LoginSignup
0
0

More than 3 years have passed since last update.

pythonで並列処理のサンプル

Last updated at Posted at 2020-08-24

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

Pythonの並列処理・並行処理をしっかり調べてみた - Qiita

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0