为python多处理设计一个好的架构

时间:2015-09-16 09:05:21

标签: python multiprocessing

我有一个用C编写的程序(比如,#34; prog")可以进行许多数值运算。我想写一个"驱动程序"在python中运行" prog"以并行方式使用不同的配置,读取其输出并记录它们。有几个问题需要考虑:

  1. 所有事情都可能随时变坏,因此必须在任何prog实例完成后尽快完成日志记录。
  2. 多个prog可以同时完成,因此应该集中进行日志记录
  3. 工人可能会以某种方式被杀,driver必须正确处理这种情况
  4. 处理KeyboardInterrupt时,所有工人和记录器必须正确终止而不会产生大量回溯
  5. 前两点让我认为所有工作人员都必须通过例如logger将结果发送给某个集中的multiprocessing.Queue工作人员。但似乎第三点使得这个解决方案变得糟糕,因为如果一个工作者被杀死,队列将会被破坏。所以队列不合适。相反,我可以使用多个进程来处理管道(即每个工作人员通过管道与记录器连接)。但随后出现了其他问题:

    1. 从管道读取是一个阻塞操作,因此一个记录器不能从几个工作程序异步读取(使用线程?)
    2. 如果某个工作人员被杀并且管道已损坏,记录器如何对此进行诊断?
    3. P.S。点#4似乎是可以解决的 - 必须

      1. 禁用所有工人和记录器中的默认SIGINT处理;

      2. try except块添加到主进程,以便在处理SIGINT异常时进行pool.terminate();pool.join()调用。

      3. 如果可能的话,请你建议一个更好的设计方法,如果不是如何解决上述问题?

        P.S。 python 2.7

1 个答案:

答案 0 :(得分:1)

您可以从这里给出的答案开始:https://stackoverflow.com/a/23369802/4323

我们的想法是不使用阻止的subprocess.call(),而是使用非阻塞的subprocess.Popen。将每个实例的stdout设置为例如您为每个StringIO孩子创建的prog对象。产生所有prog,等待它们,写出它们的输出。应该与上面显示的代码相差不远。