如何在不使用池的情况下从流程中获取结果?
(我愿意关注进展:
(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?我尝试重现它但我无法使其正常工作。
随时可以获取更多信息。
答案 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