文档章节

python的select,poll,epoll用法

wilelm
 wilelm
发布于 2013/09/04 10:21
字数 288
阅读 200
收藏 0


Python代码     收藏代码  

  1. #!/usr/bin/env python  

  2. #coding=utf-8  

  3. import os  

  4. import fcntl  

  5. import select, sys, subprocess  

  6.   

  7. vmstat_pipe = subprocess.Popen('netstat', shell=True, bufsize=1024,   

  8.         stdout=subprocess.PIPE).stdout  

  9. iostat_pipe = subprocess.Popen('top', shell=True, bufsize=1024,   

  10.         stdout=subprocess.PIPE).stdout  

上面是通用代码,下面会分别用select,poll,epoll来进行读管道的数据

1.select

Python代码     收藏代码  

  1. while 1:  

  2.     infds,outfds,errfds = select.select([vmstat_pipe,iostat_pipe],[],[],5000)  

  3.     if len(infds) != 0:  

  4.         for m in infds:  

  5.             msg = m.readline()  

  6.             print "Get ", msg, "from pipe", m  

2.poll

Python代码     收藏代码  

  1. pipe_dict = {vmstat_pipe.fileno():vmstat_pipe, iostat_pipe.fileno():iostat_pipe}  

  2. p = select.poll()  

  3. p.register(vmstat_pipe, select.POLLIN|select.POLLERR|select.POLLHUP)  

  4. p.register(iostat_pipe, select.POLLIN|select.POLLERR|select.POLLHUP)  

  5. while 1:  

  6.     result = p.poll(5000)  

  7.     if len(result) != 0:  

  8.         for m in result:  

  9.             if m[1] & select.POLLIN:  

  10.                 print "Get", pipe_dict[m[0]].readline(), "from pipe", m[0]  

3.epoll

与poll的代码基本一致,只是改为epoll即可:p = select.epoll()

阻塞与非阻塞:

注意上例中都是用的readline(),而没有用read(),原因是用read()会导致阻塞,读不到数据;如果想要用read(),那么

需要设置管道为非阻塞的:

Python代码     收藏代码  

  1. fl = fcntl.fcntl(vmstat_pipe.fileno(), fcntl.F_GETFL)  

  2. fcntl.fcntl(vmstat_pipe.fileno(), fcntl.F_SETFL, fl | os.O_NONBLOCK)  

  3. fl = fcntl.fcntl(iostat_pipe.fileno(), fcntl.F_GETFL)  

  4. fcntl.fcntl(iostat_pipe.fileno(), fcntl.F_SETFL, fl | os.O_NONBLOCK)  

另外如果管道的写端关闭,会读到一个文件结束符,比如上面代码的vmstat_pipe管道写端关闭后,会一直读到文件

本文转载自:

共有 人打赏支持
wilelm
粉丝 8
博文 34
码字总数 10959
作品 0
朝阳
程序员
Python学习记录-协程、异步IO

Python学习记录-协程、异步IO [TOC] 1. 协程 线程和进程的操作是由程序触发系统接口,最后的执行者是系统;协程的操作则是程序员。 协程存在的意义:对于多线程应用,CPU通过切片的方式来切换...

ygqygq2
05/23
0
0
【select模块】select IO多路复用和select实现FTP

select是全平台通用的IO多路复用模块。最大连接数:1024。 poll和epoll没有最大连接数限制,但只能用在linux平台。 selectors是再封装模块,推荐使用。下篇会讨论。 select.(rlist, wlist, ...

等你的破船
07/26
0
0
Python 标准库 18.3 - select

select 模块一般有两个主要对象 —— 函数和 对象。 一般各平台都会有,而 是区分平台实现的,比如在 Linux 上他就是 ,在 Solaris 上叫做 。 和 实际都是访问系统调用,功能是等待 I/O 完成...

lionets
2015/07/31
0
0
Python网络编程(epoll内核监听,多任务多进程)

OJBK 接着昨天的说 select模块内的epoll函数还没说 说完epoll和本地套接字套接字基本就没了 今天主要是多进程 理论性东西比较多 主要是理解 epoll 使用方法:代码与poll基本一致(Python语言...

ParisGabriel
08/10
0
0
Linux下I/O多路复用select, poll, epoll 三种模型的Python使用

Linux下I/O多路复用select, poll, epoll 三种模型 select, poll, epoll本质上都是同步的I/O,因为它们都是在读写事件就绪后自己负责进行读写,这个读写的过程是阻塞的。 select, poll, epol...

首席贱人
2016/05/22
880
0

没有更多内容

加载失败,请刷新页面

加载更多

TypeScript基础入门之JSX(二)

转发 TypeScript基础入门之JSX(二) 属性类型检查 键入检查属性的第一步是确定元素属性类型。 内在元素和基于价值的元素之间略有不同。 对于内部元素,它是JSX.IntrinsicElements上的属性类型...

durban
38分钟前
1
0
AVA中CAS-ABA的问题解决方案AtomicStampedReference

了解CAS(Compare-And-Swap) CAS即对比交换,它在保证数据原子性的前提下尽可能的减少了锁的使用,很多编程语言或者系统实现上都大量的使用了CAS。 JAVA中CAS的实现 JAVA中的cas主要使用的是...

码代码的小司机
40分钟前
2
0
Android JNI开发系列(十三) JNI异常处理

JNI 异常处理 JNI异常与JAVA处理异常的区别 JAVA 有异常处理机制,而JNI没有 如果JAVA中异常没有捕获,后面的代码不会执行,JNI会执行 JAVA编译时的异常,是在方法显示的声明了某一个异常,编...

蔡小鹏
53分钟前
2
0
简单介绍Java 的JAR包、EAR包、WAR包区别

WAR包 WAR(Web Archive file)网络应用程序文件,是与平台无关的文件格式,它允许将许多文件组合成一个压缩文件。War专用于Web方面。大部分的JAVA WEB工程,都是打成WAR包进行发布的。 War是...

Linux就该这么学
今天
3
0
Qt那些事0.0.7

在帮助文档(Overview - QML and C++ Integration)中随缘遇到一张图,是关于C++对象与QML整合介绍的,值得标记下来,虽然大部分功能也有所涉猎,但是还是留个记号,万一哪天我失忆了还想写Q...

Ev4n
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部