【python】使用unix管道pipe处理stdout实时数据

现在有个实时抓包处理的程序,,大概的流程是 使用tshark抓包->实时上传,如果写log的话是可以的,但是log文件切割需要定时执行。 由于log中有些内容需要实时处理,延迟时间会导致数据误差,所以想到用类似unix管道的方式,实时处理掉标准输出的内容处理,类似生产消费者模式。

场景解说

简单的流程就是

程序输出内容到stdout–> python pipe–> python 处理程序读取管道内的输出内容,然后后续处理

正常情况下可以用生产者消费者模式或者队列来搞定,但是呢这里最开始的程序是第三方的,所以只能从stdout开始处理,也算是有啥牌打啥牌吧。

案例模拟

一个打印方法来模拟stdout输出程序,一个是python管道的处理程序。

echo.py 1秒内随机事件输出一行,一共10行

timeimport sysimport randomii = 1while ii < 10:delay = random.randint(0,100)/100.0 #1秒内的随机时间sys.stdout.write(“Talking every %s seconds, blabbed %i times\n” % (delay, ii))#如果没有flush 后面的程序无法读取的sys.stdout.flush()ii += 1time.sleep(delay)

handler.py 2秒读取一次标准输出,然后处理,比输出程序慢

subprocess import Popen, PIPEfrom os import killimport signalimport timetalkpipe = Popen([‘python’, ‘echo.py’],shell=False, stdout=PIPE)try:while True:line = talkpipe.stdout.readline()if line:print “SERVER HEARD”, line.strip()else:print “no data”time.sleep(2)except KeyboardInterrupt:print “Killing child…”kill(talkpipe.pid, signal.SIGTERM)结果总结time python handler.pySERVER HEARD Talking SERVER HEARD Talking SERVER HEARD Talking SERVER HEARD Talking SERVER HEARD Talking SERVER HEARD Talking SERVER HEARD Talking SERVER HEARD Talking SERVER HEARD Talking no datano datano datano datano data^CKilling child…python handler.py 0.03s user 0.02s system 0% cpu 27.522 total

echo.py一共是10次打印,每次输出都是在1秒以内,handler.py 2秒处理一次,可以正常的把数据处理,没有数据的时候也会取数据,根据自己的逻辑停止处理,或者是不做处理,等待下次数据到来都可以。基本上能够达成最初的设想。

人之相识,贵在相知;人之相知,贵在知心。

【python】使用unix管道pipe处理stdout实时数据

相关文章:

你感兴趣的文章:

标签云: