使用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修复了我的问题。