#!/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管道写端关闭后,会一直读到文件
结束符。
分享到:
相关推荐
相比于传统的select和poll,epoll有以下优点: 1. **性能优化**:epoll使用“红黑树”数据结构存储文件描述符,因此添加、删除和查询的效率更高。 2. **边缘触发与水平触发**:epoll支持边缘触发(EPOLLET)和水平...
相比于传统的select和poll,epoll提供了更优秀的性能和扩展性,特别是在大量文件描述符的情况下。 在这个项目中,`timer_queue.py`很可能是实现了定时器队列的主逻辑。这个队列可能包含了一些定时任务,每个任务都...
在Python编程中,处理并发的网络连接通常会涉及到I/O多路复用技术,这里主要讲解的是使用`select.epoll()`来实现socket并发处理的方法。`epoll`是Linux内核提供的一种高效I/O事件通知机制,适用于大量并发连接的情况...
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...
本文将详细介绍如何使用`epoll`实现Python服务端的方法。 首先,导入必要的模块: ```python import socket import select ``` 创建一个TCP服务器套接字: ```python tcp_socket = socket.socket(socket.AF_INET, ...
使用方法:基本与poll方法相同 * 将生产对象 poll() 改为epoll() * 将所有poll对象事件改为epoll对象事件 区别 : epoll 的效率要比 poll和select 高 epoll 的事件触发方式更多 本地套接字 linux 文件 b(块设备...
`epoll` 是 Linux 内核提供的一个高效的 I/O 多路复用机制,它比传统的 `select` 和 `poll` 更加高效。`epoll` 提供了一种更为灵活的方式来处理多个文件描述符的 I/O 事件。 1. **`select`**:是最老的多路复用机制...
epoll 相比于传统的 select 和 poll,具有更少的上下文切换和更低的内存消耗,尤其适合处理大量并发连接的服务器。 **SCGI (Simple Common Gateway Interface)** 是一种网络协议,用于将 Web 服务器与后端应用程序...
通过理解和掌握epoll的工作原理以及Python-epoll库的使用方法,可以构建出更加高效、稳定的服务器应用程序。对于从事Python网络编程或者想要提升服务器性能的开发者来说,学习和使用Python-epoll是非常有价值的。
它主要有三个函数:`select.select()`, `select.poll()`, 和 `select.epoll()`。其中,`select.select()`是最基础的,它监视三个列表:`rlist`(待读取的fd), `wlist`(待写入的fd), 和 `xlist`(待异常处理的fd)。当有...
它提供了一系列的API,包括`select()`、`poll()`以及`epoll()`等方法,用于监控文件描述符的状态变化,从而有效地管理多个I/O操作。这些功能在编写网络程序、服务器端应用等方面尤为关键。 #### `select` 方法详解 ...
-----阻塞,非阻塞,同步,异步.pdf**:这部分内容可能涉及操作系统级别的输入/输出模式,包括阻塞I/O、非阻塞I/O、同步I/O和异步I/O的区别,以及它们在Python中的实现,如使用select、poll、epoll等机制。...
socketserver框架采用了selector框架来供你选择相适应的网络通信框架, 比如select, poll, epoll等。有了这些网络框架我们就能处理高并发的网络访问了. 先看看示例代码吧: # coding: utf-8 import socketserver cl
4. **使用epoll进行I/O多路复用**:Python中的`select.epoll`类提供了类似于Linux `epoll`的API。`epoll.poll()`函数接受一个超时参数,默认情况下,如果没有事件发生则会一直阻塞。为了实现非阻塞行为,可以传入0...
它替代了传统的select和poll,解决了它们在大量文件描述符时性能下降的问题。epoll通过内核用户空间交互,实现了事件驱动,减少了不必要的系统调用,提高了效率。epoll的两种主要操作:`epoll_create`创建一个epoll...
这里我们主要讨论的是在Unix/Linux系统及类似系统(如Python、Go等编程语言)中的`select`函数及其用法。`select`是处理并发I/O操作的一种常见方法,特别适用于网络编程和服务器端开发。 `select`函数允许程序在一...
libevent本身是一个跨平台的库,支持多种事件通知机制,如epoll(Linux),kqueue(FreeBSD,NetBSD,OpenBSD),poll和select等,这些机制都用于在大量并发连接中高效地检测和处理事件。通过libevent,程序员可以...