1

使用多处理 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

我建议绕过问题并使用multiprocessing.Pool例如api)。

(从文档中的示例修改)

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))

或者,您可以设置生产者/消费者方案并拥有固定数量的长时间运行的子流程。

第三种真正快速而肮脏的方法是使用一个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 回答
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 回答