io多路复用

单个process可以同时处理多个网络连接的IO

参考如下博客:
https://www.cnblogs.com/maociping/p/5129858.html
https://blog.csdn.net/mx472756841/article/details/70145762
 原生socket客户端在与服务端建立连接时,即服务端调用accept方法时是阻塞的,同时服务端和客户端在收发数据(调用recv、send、sendall)时也是阻塞的。原生socket服务端在同一时刻只能处理一个客户端请求,即服务端不能同时与多个客户端进行通信,实现并发,导致服务端资源闲置(此时服务端只占据 I/O,CPU空闲)。
    现在的需求是:我们要让多个客户端连接至服务器端,而且服务器端需要处理来自多个客户端请求。很明显,原生socket实现不了这种需求,此时我们该采用什么方式来处理呢?
    解决方法:采用I/O多路复用机制。在python网络编程中,I/O多路复用机制就是用来解决多个客户端连接请求服务器端而服务器端能正常处理并响应给客户端的一种机制。书面上来说,就是通过1种机制:可以同时监听多个文件描述符,一旦描述符就绪,能够通知程序进行相应的读写操作。
    I/O多路复用是指:通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。

IO多路复用有些地方也称这种IO方式为事件驱动IO(event driven IO)。我们都知道,select/epoll的好处就在于单个process就可以同时处理多个网络连接的IO。它的基本原理就是select /epoll这个function会不断的轮询所负责的所有socket,当某个socket有数据到达了,就通知用户进程。

I/O多路复用是用于提升效率,单个进程可以同时监听多个网络连接IO
I/O是指Input/Output
I/O多路复用,通过一种机制,可以监视多个文件描述符,一旦描述符就绪(读就绪和写就绪),能通知程序进行相应的读写操作。
I/O多路复用避免阻塞在io上,原本为多进程或多线程来接收多个连接的消息变为单进程或单线程保存多个socket的状态后轮询处理.
import select

import socket

import datetime

posted @ 2018-08-25 15:58  蹲坑蘑菇  阅读(117)  评论(0编辑  收藏  举报