【python】使用unix管道pipe处理stdout实时数据
现在有个实时抓包处理的程序,大概的流程是 使用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实时数据的更多相关文章
- (转)Windows管道(Pipe)重定向stdout,stderr,stdin
参考: http://qiusuoge.com/11496.html http://www.cnblogs.com/BoyXiao/archive/2011/01/01/1923828.html st ...
- 飘逸的python - 几行代码实现unix管道风格的函数调用
用过linux的基本知道它的管道,是将一个程序或命令的输出作为还有一个程序或命令的输入. 废话少说,以下我们看用python怎么实现unix管道风格的函数调用. #coding=utf-8 class ...
- Unix/Linux进程间通信(二):匿名管道、有名管道 pipe()、mkfifo()
1. 管道概述及相关API应用 1.1 管道相关的关键概念 管道是Linux支持的最初Unix IPC形式之一,具有以下特点: 管道是半双工的,数据只能向一个方向流动:需要双方通信时,需要建立起两个管 ...
- [b0037] python 归纳 (二二)_多进程数据共享和同步_管道Pipe
# -*- coding: utf-8 -*- """ 多进程数据共享 管道Pipe 逻辑: 2个进程,各自发送数据到管道,对方从管道中取到数据 总结: 1.只适合两个进 ...
- 管道Pipe
管道Pipe java.nio.channels包中含有一个名为Pipe(管道)的类.广义上讲,管道就是一个用来在两个实体之间单向传输数据的导管.管道的概念对于Unix(和类Unix)操作系统的用户来 ...
- Linux简单程序实例(GNU工具链,进程,线程,无名管道pipe,基于fd的文件操作,信号,scoket)
一, GNU工具链简介: (1)编译代码步骤: 预处理 -> 编译 -> 汇编 -> 链接: 预处理:去掉注释,进行宏替换,头文件包含等工作: gcc -E test.c -o te ...
- Linux进程间通信之管道(pipe)、命名管道(FIFO)与信号(Signal)
整理自网络 Unix IPC包括:管道(pipe).命名管道(FIFO)与信号(Signal) 管道(pipe) 管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道 ...
- linux中管道(pipe)一谈
/*********************************************** 管道(pipe)是Linux上进程间通信的一种方式,其是半双工(数据流只能在一个方向上流动(还需要经过 ...
- Python--线程队列(queue)、multiprocessing模块(进程对列Queue、管道(pipe)、进程池)、协程
队列(queue) 队列只在多线程里有意义,是一种线程安全的数据结构. get与put方法 ''' 创建一个“队列”对象 import queue q = queue.Queue(maxsize = ...
随机推荐
- Luogu P2756 [网络流24题]飞行员配对方案问题_二分图匹配
二分图模板题 我用的是匈牙利 其实最大流也可以做 #include<iostream> #include<cstdio> #include<cstdlib> #in ...
- PyCharm 2018.1破解过程
一.下载 首先从官网下载 官网,如果开了酸酸乳的话无法下载,官网会自动断开连接.所以下载时请关闭酸酸乳 二.安装 选择安装路径 选择64位,创建关联.py文件 安装完后运行Pycharm 选择不导入开 ...
- Node.js 模块
稳定性: 5 - 锁定 Node 有简单的模块加载系统.在 Node 里,文件和模块是一一对应的.下面例子里,foo.js 加载同一个文件夹里的 circle.js 模块. foo.js 内容: va ...
- Programming In Scala笔记-第六章、函数式对象
这一章主要是以定义和完善一个有理数类Rational为线索,分析和介绍有关类定义,构造函数,方法重写,变量定义和私有化,以及对操作符的定义等. 一.Rational类定义和构造函数 1.定义一个空类 ...
- Xcode在playground的quick look框中显示对象自定义视图
对于一般对象,playground中默认的quick look显示已经够用,比如简单的字符串,Int,或简单的自定义Class等等. 不过对于有些情况,我们需要自定义对象在playground中的显示 ...
- The Zen Programmer
专注 何为专注 关于 休息 怎么睡觉 心无杂念 我的体会 自我分析 初学者心态 无我 不要设置职业目标 敏事慎言 正念 做自己的老板 玩物养志 结语 最近在研读Christian Grobmeier ...
- Spring常用配置(二)
OK,上篇博客我们介绍了Spring中一些常见的配置,上篇博客中介绍到的都是非常常见的注解,但是在Spring框架中,常见的注解除了上篇博客提到的之外,还有许多其他的注解,只不过这些注解相对于上文提到 ...
- TextView + Spanned实现图文混排以及图片点击交互
最近要实现图文混排的需求,webview过大,所以想到了用SpannableStringBuilder来实现. 不过参考了大量国内文章,大多数是教你如何实现图文混排,并没有提及图片点击交互的.有翻阅了 ...
- Eclipse中配置javap命令
Run→External Tools→External Tools Configurations-进入如下图二所示的Program配置界面.也可以通过如下图一所示的工具栏按钮进入Program配置界面 ...
- activiti bpmnModel使用
bpmnModel对象,是activiti动态部署钟很重要的一个对象,如果bpmnModel对象不能深入的理解,那可能如果自己需要开发一套流程设计器,就显得力不从心,之前我们公司自己开发了一套acti ...