Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用python/popen通过管道处理大量数据_Python_Subprocess_Pipe_Popen - Fatal编程技术网

使用python/popen通过管道处理大量数据

使用python/popen通过管道处理大量数据,python,subprocess,pipe,popen,Python,Subprocess,Pipe,Popen,我试图观察一个过程并等待某个模式,比如: 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()

我试图观察一个过程并等待某个模式,比如:

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-m cProfile-s time myscript.py(如果我没记错的话)当你声称它太慢时,你是说这个进程正在快速生成输出,但是你的读取方法正在处理管道太慢吗?所谓“太慢”,我的意思是这些行似乎在缓冲,而python似乎在处理它太慢。实际情况是,正如您在回答中指出的,缓冲区大小太大。将其设置为1修复了我的问题。