Python IO多路复用select模块

多路复用的分析实例:服务端、客户端

#服务端配置
from socket import *
import time
import select

server = socket(AF_INET, SOCK_STREAM)
server.bind((‘127.0.0.1‘,8080))
server.listen(5)
server.setblocking(False)
‘‘‘
select/epoll的优势并不是对于单个连接能处理得更快,而是在于能处理更多的连接。
当任何一个socket中的数据准备好了,select就会返回,会从操作系统将数据拷贝到应用程序中

1.select.select(read_list,write_list,[],5)是由应用程序发起的,发送给操作系统,让操作系统去找有数据的套接字socket
    5:可以不用写,意思是5秒如果有数据连接进来会执行,如果没有回执行下一行代码(不用写是因为如果没数据执行下面的也没意义,
    能执行下面的代码,肯定是上面有数据过来已经成功建立了连接)

    重点:是没有数据过来才阻塞
          有数据过来会一直运行,不会阻塞

2.异步IO:
    发送之后不用管,会自动把结果发给你,发一个给操作系统就不用管了(用于爬虫,效率最高)

‘‘‘
data_dic={} #设置一个空字典,目的是用于将conn:data 一一绑定
read_list=[server,]   #放和收消息有关的套接字 conn.recv()  server.accept(),是被检测的一些套接字
write_list=[]   #send写数据,存放建立好的一些套接字服务端
print(‘start....‘)
while True:
    #select执行的返回结果是维护的列表里面,哪个有数据过来了
    rl,wl,xl=select.select(read_list,write_list,[])  #这里select在指定的时间段内不停的去问操作系统要数据,如果没有数据就会执行下面一行代码
    print(read_list) #read_list=[server,conn1,conn2,conn3,conn4]
    print(rl,len(rl))     #重点理解:上面循环每次得到r1只时包换操作系统询问到的有数据的套接字[conn1,conn2..]
    #r1就是select返回的有
    # print(‘read_list:%s rl:%s wl:%s ‘ %(len(read_list),len(rl),len(wl))) #rl=[conn1,conn2]

#注意:

    #1.刚开始循环r1里面只有server,read_list=[server]里面也只有server,此时r1和read_list里面内筒一样
    #2.刚开始read_list=[server,conn] server是负责建立新连接的,conn是负责收消息的

    #3.当服务端accept()收到新的连接并加入到read_list[server,conn]里面,
    # 问到结果之后此时 rl,wl,xl=select.select(read_list,write_list,[]),得到的r1里面只包含已经有数据过来的连接

    #read_list里面的连接请求不会取走,只要有数据就不会阻塞,阻塞的情况是列表里面没有数据拿
    #r1里面去依次for循环取数据,如果是server套接字对象就是accept(),否则就负责recv()数据
    for sk in rl:   #初始状态read_list里面放的的是server套接字,需要执行accept操作
        if sk == server:     #判断for循环,首先只有server服务端负责accept()接收
            conn,addr=sk.accept()
            read_list.append(conn)   #后面并发的数量多了时要往read_list里面放一些有数据的套接字对象
        else:
            # sk.recv(1024)
            # print(sk)
            data=sk.recv(1024)
            write_list.append(sk)  #有消息往外回所以加进去了
            data_dic[sk]=data  #制作字典绑定send的对象和数据:格式为发送的对象conn:对应发送的数据 data

            #因为conn占用了应用程序的资源、对应操作系统还有维持连接

    for sk in wl:
        sk.send(data_dic[sk].upper())   #根据字典里面对应的socket套接字对象拿到,拿到
        data_dic.pop(sk)  #发完之后字典里面就没必要存放消息了,所以就回收
        write_list.remove(sk) #回完之后没有了,所以就删除

        #write_list还没满的情况下会返回w1
        #read_list占应用程序的资源

        # 因为conn占用了应用程序的资源、对应操作系统还要维持链接
#客户端配置
from socket import *
import os

client=socket(AF_INET,SOCK_STREAM)
client.connect((‘127.0.0.1‘,8080))

while True:
    msg=input(‘输入要操作的命令:‘)
    client.send(msg.encode(‘utf-8‘))
    data=client.recv(1024)
    print(data.decode(‘utf-8‘))

原文地址:https://www.cnblogs.com/yangzhizong/p/9334772.html

时间: 2024-10-08 23:37:23

Python IO多路复用select模块的相关文章

python IO 多路复用 select poll epoll

三个多路复用模型的概念 select select 原理 select 是通过系统调用来监视着一个由多个文件描述符(file descriptor)组成的数组,当select()返回后,数组中就绪的文件描述符会被内核修改标记位(其实就是一个整数),使得进程可以获得这些文件描述符从而进行后续的读写操作.select饰通过遍历来监视整个数组的,而且每次遍历都是线性的. select 优点 select目前几乎在所有的平台上支持,良好跨平台性. select 缺点 每次调用select,都需要把fd集

Python——IO多路复用之select模块epoll方法

Python——IO多路复用之select模块epoll方法 使用epoll方法实现IO多路复用,使用方法基本与poll方法一致,epoll效率要高于select和poll. .├── epoll_client.py├── epoll_server.py└── settings.py # settings.py HOST = 'localhost' PORT = 5555 buffersize = 1024 ADDR = HOST, PORT # poll_server.py from sett

Python下的select模块及方法解释

Python中有一个select模块,其中提供了:select.poll.epoll三个方法,分别调用系统的 select,poll,epoll 从而实现IO多路复用. Windows Python: 提供: select Mac Python: 提供: select Linux Python: 提供: select.poll.epoll 注意:网络操作.文件操作.终端操作等均属于IO操作,对于windows只支持Socket操作,其他系统支持其他IO操作,但是无法检测 普通文件操作 自动上次读

IO多路复用-select

首先列一下,sellect.poll.epoll三者的区别 select select最早于1983年出现在4.2BSD中,它通过一个select()系统调用来监视多个文件描述符的数组,当select()返回后,该数组中就绪的文件描述符便会被内核修改标志位,使得进程可以获得这些文件描述符从而进行后续的读写操作. select目前几乎在所有的平台上支持,其良好跨平台支持也是它的一个优点,事实上从现在看来,这也是它所剩不多的优点之一. select的一个缺点在于单个进程能够监视的文件描述符的数量存在

python中的select模块

介绍: Python中的select模块专注于I/O多路复用,提供了select  poll  epoll三个方法(其中后两个在Linux中可用,windows仅支持select),另外也提供了kqueue方法(freeBSD系统) select方法: 进程指定内核监听哪些文件描述符(最多监听1024个fd)的哪些事件,当没有文件描述符事件发生时,进程被阻塞:当一个或者多个文件描述符事件发生时,进程被唤醒. 当我们调用select()时: 1 上下文切换转换为内核态 2 将fd从用户空间复制到内

非阻塞io模型和io多路复用----select

一.四种io阻塞1.io阻塞:(1 等待数据处于阻塞状态(2从内核copy到用户态处于阻塞状态2.非io阻塞只有从内核copy到用户态处于阻塞状态3.io多路复用----->优势:可以同时监听多个对象(1从check----->ready 通过selec函数来做,处于阻塞状态(2从内核copy到用户态处于阻塞状态3.异步io不用阻塞二.io多路复用select  poll epoll 都属于io同步里面的io多路复用select:轮询问题,监听数量有限poll:提高了监听数量epoll:解决了

python IO多路复用之select

说起IO操作我们最先想到的就是读写文件.其实python中对有三种IO操作,打开文件,使用socket进行网络连接和系统的标准输入输出sys.stdin和sys.stdout.我们先来看一段socket服务端的代码: import socket ip_port = ('127.0.0.1',9999) sk = socket.socket() sk.bind(ip_port) sk.listen(5) while True:     """     程序运行到accept()

转一贴,今天实在写累了,也看累了--【Python异步非阻塞IO多路复用Select/Poll/Epoll使用】

下面这篇,原理理解了, 再结合 这一周来的心得体会,整个框架就差不多了... http://www.haiyun.me/archives/1056.html 有许多封装好的异步非阻塞IO多路复用框架,底层在linux基于最新的epoll实现,为了更好的使用,了解其底层原理还是有必要的.下面记录下分别基于Select/Poll/Epoll的echo server实现.Python Select Server,可监控事件数量有限制: 1 2 3 4 5 6 7 8 9 10 11 12 13 14

python IO 多路复用

一.epoll epoll 参考链接: https://www.cnblogs.com/Alanpy/articles/5125986.html epoll  参考链接: https://www.cnblogs.com/maociping/p/5132583.html 二. selectors 模块 实现IO多路复用 selectors 参考链接: https://blog.csdn.net/jjjndk1314/article/details/79682958 三.select 模块 样例: