【问题标题】:python queue concurrency process managementpython队列并发进程管理
【发布时间】:2010-11-03 10:55:11
【问题描述】:

用例如下: 我有一个运行一系列的脚本 用于减少(脉冲星)数据的非 python 可执行文件。我现在用 subprocess.Popen(..., shell=True) 然后是 subprocess 的通信功能 从非 python 可执行文件中捕获标准输出和标准错误,以及我使用 python 日志记录模块记录的捕获输出。

问题是:现在大部分时间只使用了可能的 8 个核心中的一个。 我想产生多个进程,每个进程并行执行数据集的一部分,并且我想跟踪进度。它是一个脚本/程序,用于分析来自低频射电望远镜 (LOFAR) 的数据。安装/管理和测试越容易越好。 我正要构建代码来管理这一切,但我确定它一定已经以某种简单的库形式存在。

【问题讨论】:

  • "运行一系列非 python 可执行文件" 同时?还是连续的?请包含工作代码的 sn-p 以解释您在做什么。

标签: python concurrency process queue


【解决方案1】:

subprocess 模块可以很好地为您启动多个进程,并跟踪它们。但是,问题在于读取每个进程的输出而不阻塞任何其他进程。根据平台的不同,有几种方法可以做到这一点:使用select 模块查看哪个进程有数据要读取,使用fnctl 模块设置输出管道非阻塞,使用线程读取每个进程的数据( subprocess.Popen.communicate 本身在 Windows 上使用,因为它没有其他两个选项。)不过,在每种情况下,魔鬼都在细节中。

Twisted 可以为您处理所有这些问题,它可以生成任意数量的进程,并且可以使用它们产生的数据调用您的回调(以及其他情况。)

【讨论】:

    【解决方案2】:

    也许Celery 会满足您的需求。

    【讨论】:

      【解决方案3】:

      如果我正确理解你在做什么,我可能会建议一种稍微不同的方法。尝试将单个工作单元建立为函数,然后在并行处理上分层。例如:

      1. 将当前功能(调用子进程和捕获输出)包装到单个函数中。让函数创建一个可以返回的结果对象;或者,该函数可以写入您认为合适的文件。
      2. 创建一个可迭代对象(列表等),其中包含步骤 1 的每个数据块的输入。
      3. 创建一个多处理池,然后利用其 map() 功能为步骤 2 中的每个项目执行步骤 1 中的函数。有关详细信息,请参阅 python 多处理文档。

      您也可以使用工作者/队列模型。我认为,关键是将当前的子进程/输出捕获内容封装到一个函数中,该函数为单个数据块(无论是什么)工作。使用多种技术中的任何一种,在并行处理部分上分层非常简单,这里只描述了其中的几种。

      【讨论】:

      • 问题是代码必须在具有 python 2.5 的集群计算机上运行,​​并且多处理模块自 2.6 以来就在 python 中。 ://
      • 在你的主目录中安装 python 并使用它几乎是微不足道的。也就是说,如果您在集群上,那么您可能还有其他选择,包括批量提交到排队系统。
      猜你喜欢
      • 2018-06-27
      • 1970-01-01
      • 2017-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-18
      相关资源
      最近更新 更多