文档章节

python的select,poll,epoll用法

wilelm
 wilelm
发布于 2013/09/04 10:21
字数 288
阅读 194
收藏 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网络编程(epoll内核监听,多任务多进程)

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

ParisGabriel
08/10
0
0
Python 标准库 18.3 - select

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

lionets
2015/07/31
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

没有更多内容

加载失败,请刷新页面

加载更多

下一页

@SpringBootApplication 注解

@SpringBootApplication注解是一个组合注解,包含以下注解 @Target(ElementType.TYPE) 注解的作用目标 @Retention(RetentionPolicy.RUNTIME) Reteniton的作用是定义被它所注解的注解保留多久,...

java.刘
33分钟前
0
0
sentinel自定义DataSource实战

序 本文主要研究一下如何自定义sentinel的DataSource,这里以jdbc为例。 maven <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-sen......

go4it
48分钟前
1
0
xgboost/gbdt在调参时为什么树的深度很少就能达到很高的精度?

问题: 用xgboost/gbdt在在调参的时候把树的最大深度调成6就有很高的精度了。但是用DecisionTree/RandomForest的时候需要把树的深度调到15或更高。用RandomForest所需要的树的深度和Decisio...

tantexian
50分钟前
0
0
php-fpm的pool - 慢执行日志 - 进程管理 - open_basedir

php-fpm的pool : 为避免多站点使用同一个pool时因一个站点故障导致php资源耗尽,牵连使用同一个pool的其他站点的正常工作,可对每一个站点设置独立pool。 增加pool: 1.编辑php-fpm配置文件...

ZHENG-JY
今天
0
0
Linux之ssh服务默认端口修改

导读 SSH是标准的网络协议,可用于大多数UNIX操作系统,能够实现字符界面的远程登录管理,它默认使用22号端口,采用密文的形式在网络中传输数据,相对于通过明文传输的Telnet,具有更高的安全...

问题终结者
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部