Python与子进程通信

时间:2011-09-06 05:13:53

标签: python streaming subprocess producer-consumer

我有一个不断产生数据的子流程,但我不感兴趣的大多数数据。但偶尔,在随机时间,我需要获取输出样本 - 我需要读取它在明确界定。例如,假设进程每秒产生一个100字节的常量,有用的信息以100字节的块为单位。在它运行4秒后,我要求看到100字节的输出,然后我会对400-499字节包含兴趣。但是如果我在4.1秒时询问,我不想拦截并获得字节410-509,我需要等待并查看字节500-599。否则,该过程应该愉快地将其输出流式传输到/dev/null我不想阻止输出流。我的朋友弗雷德也可能会要求提供100个字节,比如4.6秒,所以我还需要开发这些东西,并让数据可供多个消费者阅读。

这种东西是否存在现有的设计模式?如何使用python子进程实现它,并确保与子进程的通信是非阻塞的?

3 个答案:

答案 0 :(得分:2)

我是python的新手,但似乎proc.communicate或proc.stdout.readline / readlines等待进程完成。

据我所知,您可以实现旋转日志记录并将输出重定向到文件,然后使用子进程可以在循环中触发tailf -n XX日志文件,直到程序结束,并在有请求时打印输出来自用户端。

答案 1 :(得分:1)

您可能希望不断地从给定的stdout中读取100个字节的块。然后你有一个消费者列表 - 可能只是作为带字符串/字节串的函数实现(取决于你是2.x还是3.x)。每个块都被发送给每个消费者,然后被丢弃。

这样的事情:

def f_a(s): pass
def f_b(s): pass

consumers = [f_a, f_b]

while True:
    chunk = process.stdout.read(100)
    if chunk == '': break # or something like that
    for c in consumers: c(chunk)

如果您在一个帖子中运行它,您可以根据需要修改消费者。

但你应该注意消费者不要阻止 - 否则你的循环阻止。这没问题,如果它不会持续太长时间,因为操作系统会在你的子进程和你之间提供一个相当大的缓冲区。但它不是无限的。因此,可能需要为每个消费者或循环中添加一些缓冲。

答案 2 :(得分:-1)

import subprocess
subProc= subprocess.Popen(['tail','/dev/random'],stdout=subprocess.PIPE)
subProc.stdout[400:499] ?

subProc.stdout.seek(400).read(100)

如果那些不起作用。尝试:

var = subProc.stdout
var[400:499]

另外要从子进程获取正确的输出,如果我没有弄错的话,你需要在Python3.X中偶尔刷新(): sys.stdout.flush()

由于某些奇怪的原因,我无法访问任何unix环境,所以我无法真正测试代码,但从理论上讲,这应该是你所要求的。