我有一个不断产生数据的子流程,但我不感兴趣的大多数数据。但偶尔,在随机时间,我需要获取输出样本 - 我需要读取它在明确界定。例如,假设进程每秒产生一个100字节的常量,有用的信息以100字节的块为单位。在它运行4秒后,我要求看到100字节的输出,然后我会对400-499字节包含兴趣。但是如果我在4.1秒时询问,我不想拦截并获得字节410-509,我需要等待并查看字节500-599。否则,该过程应该愉快地将其输出流式传输到/dev/null
和我不想阻止输出流。我的朋友弗雷德也可能会要求提供100个字节,比如4.6秒,所以我还需要开发这些东西,并让数据可供多个消费者阅读。
这种东西是否存在现有的设计模式?如何使用python子进程实现它,并确保与子进程的通信是非阻塞的?
答案 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环境,所以我无法真正测试代码,但从理论上讲,这应该是你所要求的。