`
zhouxi2010
  • 浏览: 51031 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

python的select,poll,epoll用法

阅读更多

 

#!/usr/bin/env python
#coding=utf-8
import os
import fcntl
import select, sys, subprocess

vmstat_pipe = subprocess.Popen('netstat', shell=True, bufsize=1024, 
        stdout=subprocess.PIPE).stdout
iostat_pipe = subprocess.Popen('top', shell=True, bufsize=1024, 
        stdout=subprocess.PIPE).stdout

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

1.select

while 1:
    infds,outfds,errfds = select.select([vmstat_pipe,iostat_pipe],[],[],5000)
    if len(infds) != 0:
        for m in infds:
            msg = m.readline()
            print "Get ", msg, "from pipe", m

2.poll

pipe_dict = {vmstat_pipe.fileno():vmstat_pipe, iostat_pipe.fileno():iostat_pipe}
p = select.poll()
p.register(vmstat_pipe, select.POLLIN|select.POLLERR|select.POLLHUP)
p.register(iostat_pipe, select.POLLIN|select.POLLERR|select.POLLHUP)
while 1:
    result = p.poll(5000)
    if len(result) != 0:
        for m in result:
            if m[1] & select.POLLIN:
                print "Get", pipe_dict[m[0]].readline(), "from pipe", m[0]

3.epoll

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

阻塞与非阻塞:

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

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

fl = fcntl.fcntl(vmstat_pipe.fileno(), fcntl.F_GETFL)
fcntl.fcntl(vmstat_pipe.fileno(), fcntl.F_SETFL, fl | os.O_NONBLOCK)
fl = fcntl.fcntl(iostat_pipe.fileno(), fcntl.F_GETFL)
fcntl.fcntl(iostat_pipe.fileno(), fcntl.F_SETFL, fl | os.O_NONBLOCK)

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

结束符。

分享到:
评论
1 楼 mimicom 2013-07-25  
有点晕了... 哎... 

相关推荐

    python-epoll-examples

    相比于传统的select和poll,epoll有以下优点: 1. **性能优化**:epoll使用“红黑树”数据结构存储文件描述符,因此添加、删除和查询的效率更高。 2. **边缘触发与水平触发**:epoll支持边缘触发(EPOLLET)和水平...

    python_epoll_timer.rar

    相比于传统的select和poll,epoll提供了更优秀的性能和扩展性,特别是在大量文件描述符的情况下。 在这个项目中,`timer_queue.py`很可能是实现了定时器队列的主逻辑。这个队列可能包含了一些定时任务,每个任务都...

    python代码,用epoll处理socket并发(csdn)————程序.pdf

    在Python编程中,处理并发的网络连接通常会涉及到I/O多路复用技术,这里主要讲解的是使用`select.epoll()`来实现socket并发处理的方法。`epoll`是Linux内核提供的一种高效I/O事件通知机制,适用于大量并发连接的情况...

    python实现Linux异步epoll代码

    if __name__==”__main__”: s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) s.bind((“”,20123)) s.listen(10) epoll=select.epoll() print s...

    python使用epoll实现服务端的方法

    本文将详细介绍如何使用`epoll`实现Python服务端的方法。 首先,导入必要的模块: ```python import socket import select ``` 创建一个TCP服务器套接字: ```python tcp_socket = socket.socket(socket.AF_INET, ...

    python网络编程DAY04.txt

    使用方法:基本与poll方法相同 * 将生产对象 poll() 改为epoll() * 将所有poll对象事件改为epoll对象事件 区别 : epoll 的效率要比 poll和select 高 epoll 的事件触发方式更多 本地套接字 linux 文件 b(块设备...

    epoll 处理并发

    `epoll` 是 Linux 内核提供的一个高效的 I/O 多路复用机制,它比传统的 `select` 和 `poll` 更加高效。`epoll` 提供了一种更为灵活的方式来处理多个文件描述符的 I/O 事件。 1. **`select`**:是最老的多路复用机制...

    epoll scgi server python 源代码

    epoll 相比于传统的 select 和 poll,具有更少的上下文切换和更低的内存消耗,尤其适合处理大量并发连接的服务器。 **SCGI (Simple Common Gateway Interface)** 是一种网络协议,用于将 Web 服务器与后端应用程序...

    python-epoll-开源

    通过理解和掌握epoll的工作原理以及Python-epoll库的使用方法,可以构建出更加高效、稳定的服务器应用程序。对于从事Python网络编程或者想要提升服务器性能的开发者来说,学习和使用Python-epoll是非常有价值的。

    Python select及selectors模块概念用法详解

    它主要有三个函数:`select.select()`, `select.poll()`, 和 `select.epoll()`。其中,`select.select()`是最基础的,它监视三个列表:`rlist`(待读取的fd), `wlist`(待写入的fd), 和 `xlist`(待异常处理的fd)。当有...

    深入理解python中的select模块

    它提供了一系列的API,包括`select()`、`poll()`以及`epoll()`等方法,用于监控文件描述符的状态变化,从而有效地管理多个I/O操作。这些功能在编写网络程序、服务器端应用等方面尤为关键。 #### `select` 方法详解 ...

    python学习资料汇总

    -----阻塞,非阻塞,同步,异步.pdf**:这部分内容可能涉及操作系统级别的输入/输出模式,包括阻塞I/O、非阻塞I/O、同步I/O和异步I/O的区别,以及它们在Python中的实现,如使用select、poll、epoll等机制。...

    基于python socketserver框架全面解析

    socketserver框架采用了selector框架来供你选择相适应的网络通信框架, 比如select, poll, epoll等。有了这些网络框架我们就能处理高并发的网络访问了. 先看看示例代码吧: # coding: utf-8 import socketserver cl

    python开发总结——c程序员python之路

    4. **使用epoll进行I/O多路复用**:Python中的`select.epoll`类提供了类似于Linux `epoll`的API。`epoll.poll()`函数接受一个超时参数,默认情况下,如果没有事件发生则会一直阻塞。为了实现非阻塞行为,可以传入0...

    http server&client;(epoll模型)

    它替代了传统的select和poll,解决了它们在大量文件描述符时性能下降的问题。epoll通过内核用户空间交互,实现了事件驱动,减少了不必要的系统调用,提高了效率。epoll的两种主要操作:`epoll_create`创建一个epoll...

    select用法

    这里我们主要讨论的是在Unix/Linux系统及类似系统(如Python、Go等编程语言)中的`select`函数及其用法。`select`是处理并发I/O操作的一种常见方法,特别适用于网络编程和服务器端开发。 `select`函数允许程序在一...

    python-libevent

    libevent本身是一个跨平台的库,支持多种事件通知机制,如epoll(Linux),kqueue(FreeBSD,NetBSD,OpenBSD),poll和select等,这些机制都用于在大量并发连接中高效地检测和处理事件。通过libevent,程序员可以...

Global site tag (gtag.js) - Google Analytics