python select()/poll()/epoll()简介

select一般用在socket网络编程中,在网络编程的过程中,经常会遇到许多阻塞的函数,网络编程时使用的recv, recvfrom、connect函数都是阻塞的函数,当函数不能成功执行的时候,程序会一直阻塞,无法执行下面的代码。这时就需要用到非阻塞的编程方式,使用select函数就可以实现非阻塞编程。

select() 和 poll() 系统调用的本质一样,poll() 的机制与 select() 类似,与 select() 在本质上没有多大差别,管理多个描述符也是进行轮询,根据描述符的状态进行处理。

(1)单个进程能够监视的文件描述符的数量存在最大限制,通常是1024,当然可以更改数量,但由于select采用轮询的方式扫描文件描述符,文件描述符数量越多,性能越差;

(2)内核 / 用户空间内存拷贝问题,select需要复制大量的句柄数据结构,产生巨大的开销;

(3)select返回的是含有整个句柄的数组,应用程序需要遍历整个数组才能发现哪些句柄发生了事件;

(4)select的触发方式是水平触发,应用程序如果没有完成对一个已经就绪的文件描述符进行IO操作,那么之后每次select调用还是会将这些文件描述符通知进程。

epoll IO多路复用模型实现机制:

由于epoll的实现机制与select/poll机制完全不同,上面所说的 select的缺点在epoll上不复存在。

 

select()和epoll()都是多路IO复用机制,主要是通过一种机制,可以监视多个描述符,一旦某个描述符准备就绪,就能通知程序进行相应的读写操作。

"select"、"poll"和"epoll"都是用于处理I/O事件(如文件、网络连接等)的机制,它们在Linux系统中被广泛使用。这些机制都提供了一种方式来监视多个文件描述符(通常是网络连接或文件句柄)的状态,以便在数据可读、可写或其他事件发生时进行通知。 1. **select**:这是最早的I/O多路复用机制之一。它通过一个循环来检查多个文件描述符的状态,看是否有可用的输入或输出。然而,select在处理大量文件描述符时效率较低,因为它需要为每个文件描述符开一个单独的线程或进程。 2. **poll**:poll是另一种I/O多路复用机制,它提供了比select更高的效率,尤其是在处理大量文件描述符的情况下。但是,它的实现比较复杂,因此在一些新版本的Linux系统中,已经被更好的机制如epoll所取代。 3. **epoll**:相比于selectpollepoll提供了一种更有效的方式来处理大量的文件描述符。它的核心是一个事件循环(Event Loop),能够通过记录所有需要监听的事件来提高效率。当有事件发生时,epoll会立即通知应用程序。此外,epoll还支持非阻塞操作,可以更有效地处理并发连接。 在编程语言中,这些机制通常由操作系统提供的系统调用或库函数来实现。例如,在Python中,可以使用`select`模块来实现类似的功能。对于需要处理大量并发连接的服务器编程,使用如Python的`socketserver`或`tornado`库或C语言的libevent库会更方便。 以上是对selectpollepoll的基本介绍。你可以根据项目需求和系统的具体配置来选择适合的I/O多路复用机制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值