【问题标题】:Multiprocessing at multiple steps: How to save returned objects?多步骤多处理:如何保存返回的对象?
【发布时间】:2014-01-03 07:16:12
【问题描述】:

我是多进程的新手,有一些非常基本的查询。

我有三个可以并行化的函数 (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 终止之后启动?

【问题讨论】:

标签: python multiprocessing


【解决方案1】:

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

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

【讨论】:

  • 如果我使用队列,那么锁是必要的。pythondocs 说,管道和队列不需要像锁这样的同步原语。这是否意味着将对象放入同一队列的多个进程不会发生冲突?
  • 不,没有必要使用队列手动锁定。您可以按照文档中的说明为队列函数指定阻塞和超时。
【解决方案2】:

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

请参阅Using Queue in python 以获得一个不错的示例(虽然使用线程而不是进程)

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

【讨论】:

    猜你喜欢
    • 2010-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-17
    • 1970-01-01
    相关资源
    最近更新 更多