代码之家  ›  专栏  ›  技术社区  ›  Stephan

python队列并发过程管理

  •  2
  • Stephan  · 技术社区  · 14 年前

    用例如下: 我有一个脚本运行一系列 用于减少(pulsar)数据的非python可执行文件。我现在用 subprocess.popen(…,shell=true),然后子进程的通信函数 使用python日志模块从非python可执行文件和捕获的输出i日志中捕获标准输出和标准错误。

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

    3 回复  |  直到 14 年前
        1
  •  2
  •   Thomas Wouters    14 年前

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

    为你处理这一切的东西是 Twisted ,它可以根据需要生成任意多个进程,并可以使用它们生成的数据(以及其他情况)调用回调。

        2
  •  2
  •   Marcelo Cantos    14 年前

    也许吧 Celery 会满足你的需要。

        3
  •  0
  •   seandavi    14 年前

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

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

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