LoginSignup
4
8

More than 5 years have passed since last update.

class methodの並列化

Last updated at Posted at 2017-03-20

class methodの並列化とプロセス監視

pythonでは、並列化ライブラリであるmultiprocessingのmultiprocessing.Poolを使って簡単に並列化が実現できるが、class method等の並列化には使えない。この場合、multiprocessing.Processをつかって並列化するしかないが、CPU数ごとにプロセスを走らせるとCPU数以上のプロセスを走らせたときに、早く終わったプロセスのCPUが空いてしまって無駄になってしまう。SGEみたいに終わったCPUから新しいプロセスを走らせられないかと思い、それ用のスクリプトを無理やり作ってみた。
もしかしたら、もっと良いやり方があるのかもしれない。

class Methodを並列化したとき並列プロセス管理のスクリプトの例。

import multiprocessing as mp
ps = []
for i in range(1000):
    ps.append(mp.Process(target=hoge,args=(i,))) #targetとなる関数もしくはメソッドを1000個生成

finishedList       = []
presentindex       = 0
for p in ps[0:mp.cpu_count()]:
    p.start()
    presentindex += 1

while 1:
    time.sleep(1)#一秒ごとに監視。
    for i, p in enumerate(ps[:presentindex]):
        if p.is_alive() or i in finishedList:#プロセスpの終了判定
            pass
        else:
            finishedList.append(i)#終了したプロセスのindexを保存
            if presentindex < len(ps):
                ps[presentindex].start()
                presentindex += 1
                print(i)

    if len(finishedList) == len(ps):#終了したプロセスと生成したプロセス数が同じだったら終了
        break
4
8
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
4
8