python队列并发进程管理器

2024-04-28 14:06:03 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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


Tags: 模块数据函数脚本true可执行文件标准进程
3条回答

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

可以为您处理所有这些问题的是Twisted,它可以根据需要生成任意多个进程,并可以使用它们生成的数据调用回调(以及其他情况)

也许Celery能满足你的需要。在

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

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

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

相关问题 更多 >