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

场景解说

简单的流程就是

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

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

案例模拟

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

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

  1. #coding:utf-8
  2. #author:orangleliu
  3. #title: echo.py
  4. import time
  5. import sys
  6. import random
  7. ii = 1
  8. while ii < 10:
  9. delay = random.randint(0,100)/100.0 #1秒内的随机时间
  10. sys.stdout.write("Talking every %s seconds, blabbed %i times\n" % (delay, ii))
  11. #如果没有flush 后面的程序无法读取的
  12. sys.stdout.flush()
  13. ii += 1
  14. time.sleep(delay)

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

  1. #coding:utf-8
  2. #orangleliu
  3. #title: handler.py
  4. from subprocess import Popen, PIPE
  5. from os import kill
  6. import signal
  7. import time
  8. talkpipe = Popen(['python', 'echo.py'],
  9. shell=False, stdout=PIPE)
  10. try:
  11. while True:
  12. line = talkpipe.stdout.readline()
  13. if line:
  14. print "SERVER HEARD", line.strip()
  15. else:
  16. print "no data"
  17. time.sleep(2)
  18. except KeyboardInterrupt:
  19. print "Killing child..."
  20. kill(talkpipe.pid, signal.SIGTERM)

结果总结

  1. time python handler.py
  2. SERVER HEARD Talking every 0.35 seconds, blabbed 1 times
  3. SERVER HEARD Talking every 0.87 seconds, blabbed 2 times
  4. SERVER HEARD Talking every 0.31 seconds, blabbed 3 times
  5. SERVER HEARD Talking every 0.05 seconds, blabbed 4 times
  6. SERVER HEARD Talking every 0.9 seconds, blabbed 5 times
  7. SERVER HEARD Talking every 0.74 seconds, blabbed 6 times
  8. SERVER HEARD Talking every 0.33 seconds, blabbed 7 times
  9. SERVER HEARD Talking every 0.63 seconds, blabbed 8 times
  10. SERVER HEARD Talking every 0.47 seconds, blabbed 9 times
  11. no data
  12. no data
  13. no data
  14. no data
  15. no data
  16. ^CKilling child...
  17. 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. Luogu P2756 [网络流24题]飞行员配对方案问题_二分图匹配

    二分图模板题 我用的是匈牙利 其实最大流也可以做 #include<iostream> #include<cstdio> #include<cstdlib> #in ...

  2. PyCharm 2018.1破解过程

    一.下载 首先从官网下载 官网,如果开了酸酸乳的话无法下载,官网会自动断开连接.所以下载时请关闭酸酸乳 二.安装 选择安装路径 选择64位,创建关联.py文件 安装完后运行Pycharm 选择不导入开 ...

  3. Node.js 模块

    稳定性: 5 - 锁定 Node 有简单的模块加载系统.在 Node 里,文件和模块是一一对应的.下面例子里,foo.js 加载同一个文件夹里的 circle.js 模块. foo.js 内容: va ...

  4. Programming In Scala笔记-第六章、函数式对象

    这一章主要是以定义和完善一个有理数类Rational为线索,分析和介绍有关类定义,构造函数,方法重写,变量定义和私有化,以及对操作符的定义等. 一.Rational类定义和构造函数 1.定义一个空类 ...

  5. Xcode在playground的quick look框中显示对象自定义视图

    对于一般对象,playground中默认的quick look显示已经够用,比如简单的字符串,Int,或简单的自定义Class等等. 不过对于有些情况,我们需要自定义对象在playground中的显示 ...

  6. The Zen Programmer

    专注 何为专注 关于 休息 怎么睡觉 心无杂念 我的体会 自我分析 初学者心态 无我 不要设置职业目标 敏事慎言 正念 做自己的老板 玩物养志 结语 最近在研读Christian Grobmeier ...

  7. Spring常用配置(二)

    OK,上篇博客我们介绍了Spring中一些常见的配置,上篇博客中介绍到的都是非常常见的注解,但是在Spring框架中,常见的注解除了上篇博客提到的之外,还有许多其他的注解,只不过这些注解相对于上文提到 ...

  8. TextView + Spanned实现图文混排以及图片点击交互

    最近要实现图文混排的需求,webview过大,所以想到了用SpannableStringBuilder来实现. 不过参考了大量国内文章,大多数是教你如何实现图文混排,并没有提及图片点击交互的.有翻阅了 ...

  9. Eclipse中配置javap命令

    Run→External Tools→External Tools Configurations-进入如下图二所示的Program配置界面.也可以通过如下图一所示的工具栏按钮进入Program配置界面 ...

  10. activiti bpmnModel使用

    bpmnModel对象,是activiti动态部署钟很重要的一个对象,如果bpmnModel对象不能深入的理解,那可能如果自己需要开发一套流程设计器,就显得力不从心,之前我们公司自己开发了一套acti ...