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

场景解说

简单的流程就是

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

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

案例模拟

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

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

#coding:utf-8
#author:orangleliu
#title: echo.py

import time
import sys
import random

ii = 1
while 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 += 1
    time.sleep(delay)

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

#coding:utf-8
#orangleliu
#title: handler.py

from subprocess import Popen, PIPE
from os import kill
import signal
import time

talkpipe = 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.py
SERVER HEARD Talking every 0.35 seconds, blabbed 1 times
SERVER HEARD Talking every 0.87 seconds, blabbed 2 times
SERVER HEARD Talking every 0.31 seconds, blabbed 3 times
SERVER HEARD Talking every 0.05 seconds, blabbed 4 times
SERVER HEARD Talking every 0.9 seconds, blabbed 5 times
SERVER HEARD Talking every 0.74 seconds, blabbed 6 times
SERVER HEARD Talking every 0.33 seconds, blabbed 7 times
SERVER HEARD Talking every 0.63 seconds, blabbed 8 times
SERVER HEARD Talking every 0.47 seconds, blabbed 9 times
no data
no data
no data
no data
no 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实时数据的更多相关文章

  1. (转)Windows管道(Pipe)重定向stdout,stderr,stdin

    参考: http://qiusuoge.com/11496.html http://www.cnblogs.com/BoyXiao/archive/2011/01/01/1923828.html st ...

  2. 飘逸的python - 几行代码实现unix管道风格的函数调用

    用过linux的基本知道它的管道,是将一个程序或命令的输出作为还有一个程序或命令的输入. 废话少说,以下我们看用python怎么实现unix管道风格的函数调用. #coding=utf-8 class ...

  3. Unix/Linux进程间通信(二):匿名管道、有名管道 pipe()、mkfifo()

    1. 管道概述及相关API应用 1.1 管道相关的关键概念 管道是Linux支持的最初Unix IPC形式之一,具有以下特点: 管道是半双工的,数据只能向一个方向流动:需要双方通信时,需要建立起两个管 ...

  4. [b0037] python 归纳 (二二)_多进程数据共享和同步_管道Pipe

    # -*- coding: utf-8 -*- """ 多进程数据共享 管道Pipe 逻辑: 2个进程,各自发送数据到管道,对方从管道中取到数据 总结: 1.只适合两个进 ...

  5. 管道Pipe

    管道Pipe java.nio.channels包中含有一个名为Pipe(管道)的类.广义上讲,管道就是一个用来在两个实体之间单向传输数据的导管.管道的概念对于Unix(和类Unix)操作系统的用户来 ...

  6. Linux简单程序实例(GNU工具链,进程,线程,无名管道pipe,基于fd的文件操作,信号,scoket)

    一, GNU工具链简介: (1)编译代码步骤: 预处理 -> 编译 -> 汇编 -> 链接: 预处理:去掉注释,进行宏替换,头文件包含等工作: gcc -E test.c -o te ...

  7. Linux进程间通信之管道(pipe)、命名管道(FIFO)与信号(Signal)

    整理自网络 Unix IPC包括:管道(pipe).命名管道(FIFO)与信号(Signal) 管道(pipe) 管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道 ...

  8. linux中管道(pipe)一谈

    /*********************************************** 管道(pipe)是Linux上进程间通信的一种方式,其是半双工(数据流只能在一个方向上流动(还需要经过 ...

  9. Python--线程队列(queue)、multiprocessing模块(进程对列Queue、管道(pipe)、进程池)、协程

    队列(queue) 队列只在多线程里有意义,是一种线程安全的数据结构. get与put方法 ''' 创建一个“队列”对象 import queue q = queue.Queue(maxsize = ...

随机推荐

  1. brew的MAC安装

    1.介绍 brew是一个软件包管理工具,类似于centos下的yum或者ubuntu下的apt-get,非常方便,免去了自己手动编译安装的不便 brew 安装目录 /usr/local/Cellar ...

  2. echarts——各个配置项详细说明总结

      前  言    最近做了个关于各种图表的项目,用到了echarts , 关于各个配置项刚开始用好多都不懂,有些地方需要改不知道改哪个参数,就在网上查了各种,总结规整了一下,跟大家分享学习一下.(e ...

  3. 日历类和日期类转换 并发修改异常 泛型的好处 *各种排序 成员和局部变量 接口和抽象类 多态 new对象内存中的变化

    day07 ==和equals的区别? ==用于比较两个数值 或者地址值是否相同.  equals 用于比较两个对象的内容是否相同   String,StringBuffer.StringBuilde ...

  4. 字符流之FileReader&FileWriter

    package zhang; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; pub ...

  5. redis的数据持久化方案

    Redis的持久化方案有两种 1.Rdb方式:快照形式,定期将内存中的数据持久化到硬盘.是Redis默认的数据持久化的形式. Rdb:缺点是:数据还没有更新到磁盘上,突然断电,造成数据的不完整性. 在 ...

  6. 分享一个二维码图片识别控制台程序Demo

    怎么用NuGet和配置log4net就不介绍了,直接上代码(QRDecodeDemo.zip). (Visual Studio 2015 下的项目,用的.NET Framework 4.5.2) 吐槽 ...

  7. Docker镜像的实现原理

    Docker 镜像是怎么实现增量的修改和维护的? 每个镜像都由很多层次构成,Docker 使用 Union FS 将这些不同的层结合到一个镜像中去. 通常 Union FS 有两个用途, 一方面可以实 ...

  8. springMVC源码分析--HandlerMethodReturnValueHandlerComposite返回值解析器集合(二)

    在上一篇博客springMVC源码分析--HandlerMethodReturnValueHandler返回值解析器(一)我们介绍了返回值解析器HandlerMethodReturnValueHand ...

  9. Linux中MySQL忽略表中字段大小写

    linux 下,mysql 的表面默认是区分大小写的,windows 下默认不区分大小写,我们大多数在windows 下开发,之后迁移到linux(特别是带有Hibernate的工程),可以修改配置是 ...

  10. Android二维码扫描、生成

    Android二维码扫描.生成 现在使用二维码作为信息的载体已经越来越普及,那么二维码的生成以及扫描是如何实现的呢 google为我们提供了zxing开源库供我们使用 zxing GitHub源码地址 ...