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