多个步骤的多处理:如何保存返回的对象?

时间:2014-01-03 07:16:12

标签: python multiprocessing

我是多重访问的新手,并且有一些非常基本的查询。

我有三个可以并行化的函数(fun1(<list>),fun2(<dict>,<int>),fun3(<dict>,<dict>))。 fun1(字典)的输出是fun2的输入,依此类推。

我必须合并所有正在运行fun1的工作人员的输出,然后再将其传递给fun2(同样适用于fun2 -> fun3转换)。

考虑以下代码:

if __name__=='__main__':
    process1=[]
    for i in range(args.numcores):
        p1=Process(target=fun1, args=(m[i],))
        process1.append(p1)
        p1.start()
    for p in process1:  
        p.join()

    process2=[]
    for i in range(args.numcores):
        p2=Process(target=fun2, args=(g,j, ))
        process1.append(p1)
        p2.start()
    for p in process2:  
        p.join()
  1. 我可以合并不同工作人员返回的字典但是如何首先保存这些返回值(换句话说,保存返回对象的位置)?
  2. 由于p2.start()跟在p1.join()之后,这是否意味着process2将在process1终止后开始?

2 个答案:

答案 0 :(得分:1)

(2。)是的,您的程序在完成此过程之前不会继续通过join()。

(1.)您可以使用队列或数组(使用互斥锁锁定),这样就可以将返回数据添加到(多处理。)队列或数组中(如果是数组)或非多处理类型,使用锁定以确保不会同时访问它们。然后你可以在之后读取队列/数组中的值。

答案 1 :(得分:1)

查看Python的multiprocessing.Queue类以合并输出。一般的想法是将函数包装在另一个函数中,该函数将每个函数的结果附加到Queue。然后,当函数终止时,从队列中拉出。

请参阅Using Queue in python以获得一个不错的示例(带有线程而不是进程的albiet)

http://docs.python.org/2/library/multiprocessing.html#multiprocessing.Queue