当前位置: 首页 > 后端技术 > Python

Select模块

时间:2023-03-25 23:09:16 Python

概述Python中的select模块专注于I/O多路复用,提供了三种方法:selectpollepoll(后两种在linux下才有,windows只支持select),kqueue也提供了方法(freeBSD系统),下面将着重介绍select和epoll方法。select方法process指定内核监视哪些文件描述符(最多1024fds)和哪些事件。当没有文件描述符事件发生时,进程被阻塞;当一个或多个文件描述符事件发生时,进程被唤醒。当我们调用select()时:  1上下文切换到内核模式  2将fd从用户空间复制到内核空间  3内核遍历所有fd,看是否有相应的事件发生  4如果有没有发生,阻止进程。当设备驱动产生中断或超时时,唤醒进程重新遍历  5遍历后返回fd  6将fd从内核空间复制到用户空间注意:fd对于文件描述符epoll方法epoll改进了select很好:  1epoll的解决方案在epoll_ctl函数中。每次有新的事件注册到epoll句柄上,所有的fds都会被复制到内核中,而不是在epoll_wait期间重复复制。epoll保证在整个过程中每个fd只会被复制一次。  2epoll会遍历epoll_ctl中指定的fd(这个时候必不可少),为每个fd指定一个回调函数。当设备就绪并唤醒等待队列中的等待者时,会调用这个回调函数,这个回调函数会将就绪的fd添加到就绪列表中。epoll_wait的作用其实就是检查这个就绪链表中是否有就绪的fd  3epoll对文件描述符没有额外的限制。Leveltriggeringandedgetriggering:Level_triggered(电平触发,有时也叫条件触发):当监听的文件描述符上发生可读写事件时,epoll.poll()会通知Handler进行读写。如果这次没有一次性读写数据(比如读写缓冲区太小),那么下次调用epoll.poll()时,它也会通知你在文件描述符上继续那还没有被阅读和写入。读写,当然,如果你不读写,它会一直通知你!!!如果系统中有大量不需要读写的就绪文件描述符,每次都会返回,这会大大降低handler检索自己关心的就绪文件描述符的效率!!!优点显而易见:稳定可靠Edge_triggered(边缘触发,有时也称为状态触发):当被监控的文件描述符上发生可读写事件时,epoll.poll()会通知handler进行读写。如果你这次没有读写所有的数据(比如读写缓冲区太小),下次调用epoll.poll()时不会通知你,也就是只会通知你一次直到文件描述只有在符号上有第二次读/写事件时才会通知您!!!这种模式比级别触发更高效,系统不会被大量你不关心的就绪文件描述符淹没!!!缺点:在一定条件下不可靠更多技术资料可关注:gzitcast