我正在尝试观察一个过程并等待某种模式,例如:

open someFile id=123


然后,在那之后,我想等待

close id=123


我尝试将脚本编写如下:

running_procs = [Popen(["process", "and", "options"], stdout=PIPE, stderr=PIPE)]

while running_procs:
    for proc in running_procs:
        retcode = proc.poll()
        if retcode is not None: # Process finished.
            running_procs.remove(proc)
            break
        else:
            while True:
                next_line = proc.stdout.readline()
                if next_line == '' and proc.poll() != None:
                    break
                m = re.search( r'someFile.*id\=([0-9]*)', next_line, re.M|re.I)
                if m:
                  print m.group(1)


但是它的执行速度似乎太慢。对处理管道中的许多管线有什么建议吗?有没有更快的方法?

最佳答案

在此特定示例中,没有任何内容表明仅出于代码原因它应该变慢。列表中只有一个进程,它读取行的速度与该进程使它们可用的速度一样快。这意味着代码将取决于子进程刷新其输出并使行可用。但这确实是可以预期的。

由于您将始终要逐行读取,因此您可能需要在Popen中设置bufsize=1,以确保其始终被行缓冲:

Popen(["process"], stdout=PIPE, stderr=PIPE, bufsize=1)


但是,如果您打算运行多个进程,我确实会看到一个问题,这表明您正在使用可能的进程列表并从中弹出死进程。您的循环将一次阻塞一个进程。如果这不是您要串行读取进程的意图,那么这将导致恢复数据的速度变慢。它们并行运行,但只能串行监视。

除此之外,您还必须进一步详细说明为什么您认为结果缓慢以及预期会发生什么。

关于python - 使用python/popen通过管道处理大量数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11217825/

10-13 05:37