1

multiprocessing python ライブラリを使用すると、次のようにマルチプロセスを起動できます

import multiprocessing as mu

def worker(n)
        print "worker:", n
        n = int(1e4)
        for i in range(n):
                for j in range(n):
                        i*j 
        return

if __name__ == '__main__':
        jobs = []
        for i in range(5):
                p = mu.Process(target=worker, args=(i,))
                jobs.append(p)
                p.start()

プロセッサ(CPUコア)の数を取得できます

np = mu.cpu_count()

しかし、プロセスのリストがある場合、プロセッサを過充電せずに起動するにはどうすればよいですか?
クアッド コアを使用している場合、最初の 4 つのプロセスを起動するにはどうすればよいですか? プロセスが終了したら、他のプロセスを起動します。

参考文献

4

2 に答える 2

1

私はこの解決策を作ります

import multiprocessing as mu

def worker(n):
        print "worker:", n
        n = int(1e4/2)
        for i in range(n):
                for j in range(n):
                        i*j
        return

if __name__ == '__main__':
        jobs = []
        for i in range(5):
                p = mu.Process(target=worker, args=(i,))
                jobs.append(p)

        running = []
        np = mu.cpu_count()

        for i in range(np):
                p = jobs.pop()
                running.append(p)
                p.start()

        while jobs != []:
                for r in running:
                        if r.exitcode == 0:
                                running.remove(r)
                                p = jobs.pop()
                                p.start()
                                running.append(p)
于 2012-12-05T15:48:32.703 に答える
1

multiprocessing.Pool問題を回避して( exampleapi )を使用することをお勧めします。

(ドキュメントの例から変更)

from multiprocessing import Pool

def f(x):
    return x*x

if __name__ == '__main__':
    num_proc = multiprocessing.cpu_count()
    pool = Pool(processes=num_proc)
    res = pool.map(f, range(10))

または、プロデューサー/コンシューマー スキームを設定し、一定数の長期実行サブプロセスを設定することもできます。

3 つ目の非常に手っ取り早い方法は、 one を使用することmu.Queueです。get結果が返されるまでブロックすることに注意してください。

import multiprocessing as mu
import time
res = mu.Queue()

def worker(n):
    print "worker:", n
    time.sleep(1)
    res.put(n)
    return

if __name__ == '__main__':
    jobs = []
    np = mu.cpu_count()
    print np
    # start first round
    for j in range(np):
        p = mu.Process(target=worker, args=(j,))
        jobs.append(p)
        p.start()
    # every time one finishes, start the next one
    for i in range(np,15):
        r = res.get()
        print 'res', r
        p = mu.Process(target=worker, args=(i,))
        jobs.append(p)
        p.start()
    # get the remaining processes 
    for j in range(np):
        r = res.get()
        print 'res', r
于 2012-12-05T14:59:40.790 に答える