python之异步select解析

Posted 流年似水zlw

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python之异步select解析相关的知识,希望对你有一定的参考价值。

一、I/O多路复用

I/O的含义:在计算机领域常说的IO包括磁盘IO和网络IO,我们所说的IO复用主要是指网络IO;在Linux中一切皆文件,因此网络IO也经常用文件描述符FD来表示。

复用的含义:在通信领域中为了充分利用网络连接的物理介质,往往在同一条网络链路上采用时分复用或频分复用的技术,使其在同一链路上传输多路信号,即公用某个“介质”来尽可能多的做同一类(性质)的事,在网络场景中复用的“介质”就是任务处理线程,所以简单理解就是多个IO共用1个线程。

I/O复用的好处:在传统意义上,对于多线程并发的处理方式是,服务端监听客户端请求,也就是I/O流,每有一个I/O流进来,程序就创建一个线程处理这个I/O流,假设现在有一百万个I/O流进来,那就需要开启一百万个线程一一对应处理这些I/O流,这样CPU占有率很高,而且这些I/O流可能大部分时间只是连接着,没有实际的数据读写,这也造成系统资源的浪费,所以人们提出了I/O多路复用这个模型,一个线程,通过记录I/O流的状态来同时管理多个I/O,可以提高服务器的吞吐能力。

因此就可以利用一个函数(select和poll)来监听I/O所需的这些数据的状态,一旦I/O有数据可以进行读写了,进程(也可以说是线程)就来对这样的IO进行服务。

select,poll,epoll都是IO多路复用的机制,I/O多路复用就是通过一种机制,让单个进程可以监视多个文件描述符,一旦某个描述符就绪(一般是读就绪或者就绪),能够通知应用程序进行相应的读写操作。

但select,poll,epoll本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的,而异步I/O则无需自己负责进行读写,异步I/O的实现会负责把数据从内核拷贝到用户空间。

二、Python select

Python的select()方法直接调用操作系统的IO接口,它监控sockets,open files, and pipes(所有带fileno()方法的文件句柄)何时变成readable 和writeable, 或者通信错误,select()使得同时监控多个连接变的简单,并且这比写一个长循环来等待和监控多客户端连接要高效,因为select直接通过操作系统提供的C的网络接口进行操作,而不是通过Python的解释器。

select()方法接收并监控3个通信列表, 第一个是所有的输入的data,即外部发过来的数据,第2个是所有要发出去的data,第3个监控错误信息。需要创建2个包含输入和输出信息列表来传给select(),列表里是服务端和客户端socket对象。

程序的主循环,调用select()时会阻塞和等待直到新的连接和数据进来。

当你把inputs,outputs,exceptional(这里跟inputs共用)传给select()后,它返回3个新的list,我们上面将他们分别赋值为readable,writable,exceptional, 所有在readable list中的socket连接代表有数据可接收(recv),所有在writable list中的存放着你可以对其进行发送(send)操作的socket连接,当连接通信出现error时会把error写到exceptional列表中。

 

参考博客https://www.cnblogs.com/alex3714/p/4372426.html

以上是关于python之异步select解析的主要内容,如果未能解决你的问题,请参考以下文章

asyncio创建协程解析——分析廖雪峰的Python教程之创建WEB服务(转)

python-select异步IO

python 异步 select pooll epoll

python之IO多路复用——selectpollepoll详解

python第五十三天--进程,协程.select.异步I/O...

本篇为你深度解析 Python 异步到底是怎么实现的?