Python 2.7多处理使用池获取处理结果

时间:2015-05-12 11:17:25

标签: python process multiprocessing

如何在不使用池的情况下从流程中获取结果?

(我愿意关注进展:

(print "\r",float(done)/total,"%",)

据我所知,不能使用游泳池来完成

def multiprocess(function, argslist, ncpu):
    total = len(argslist)
    done = 0
    jobs = []
    while argslist != []:
        if len(mp.active_children()) < ncpu:
            p = mp.Process(target=function,args=(argslist.pop(),))
            jobs.append(p)
            p.start()
            done+=1
            print "\r",float(done)/total,"%",
    #get results here
    for job in jobs:
        job.get_my_result()???

这些过程非常短(<0.5秒),但我有大约100万个。

我看到了这个帖子Can I get a return value from multiprocessing.Process?我尝试重现它但我无法使其正常工作。

随时可以获取更多信息。

2 个答案:

答案 0 :(得分:2)

这个问题可能被视为重复,但无论如何这里是解决我的问题的方法:

def multiprocess(function, argslist, ncpu):
    total = len(argslist)
    done = 0
    result_queue = mp.Queue()
    jobs = []
    while argslist != [] and done<10 :
        if len(mp.active_children()) < ncpu:
            p = mp.Process(target=function,args=(result_queue, argslist.pop(),))
            jobs.append(p)
            p.start()
            done+=1
            print "\r",float(done)/total,"%",
    #get results here
    res = [result_queue.get() for p in jobs]
    print res

我必须改变

return function_result

进入

result_queue.put(function_result)

答案 1 :(得分:1)

最简单的方法应该是作为参数传递给函数的队列。该函数的结果可以放入该队列中,稍后您可以迭代该队列以收集所有结果或在结果到达时立即处理它。但是,它只适用于您可以使用&#34;无序&#34;结果。有关详细信息,请参阅Python文档:Examples for Multiprocessing and Queues