python:多处理管理

时间:2012-12-05 14:53:01

标签: python multiprocessing cpu-cores

使用多处理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个进程?当完成一个过程启动其他。

参考

2 个答案:

答案 0 :(得分:1)

我建议使用multiprocessing.Poolexampleapi)来解决问题。

(根据文档中的示例修改)

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

答案 1 :(得分: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)