协程

1 IO多路复用

作用:IO多路复用的作用是检测多个soket是否已经发生变化(是否已经连接成功,是否已经获取数据)(可读/可写)

操作系统检测soket是否发生变化的三种模式:

select:最多有1024个soket,循环去检测

poll:不限制监听的soket个数,循环去检测(水平触发)

epoll:不限制监听soket个数,回调方式(边缘触发)

python模块:select.select  select.epoll

 1 import socket
 2 import select
 3 client1=socket.socket()
 4 client1.setblocking(False)
 5 try:
 6     client1.connect(('www,baidu.com',80))
 7 except BlockingIOError as e:
 8     pass
 9 client2=socket.socket()
10 client2.setblocking(False)
11 try:
12     client2.connect(('www.sogou.com',80))
13 except BlockingIOError as e:
14     pass
15 
16 socket_list=[client1,client2]
17 conn_list=[client1,client2]
18 
19 while True:
20     rlist,wlist,elist=select.select(socket_list,conn_list,[],0.005)  #relsit种有值表示有返回的数据(可读)
21     #  wlist有值表示已经连接成功(可写),elist表示是否有异常,有异常则放里面,0.005表示的是每测一次最多花0.005
22     for sk in wlist:  #表示wlist种有值,即表示连接成功
23         if sk==client1:
24             sk.sendall(b'GET /s?wd=alex HTTP/1.0
host:www.baidu.com

')
25         else:
26             sk.sendall(b'GET /s?wd=alex HTTP/1.0
host:www.sogou.com

')
27         conn_list.remove(sk)   #表示将连接成功的数据剔除,已经连接过了,不用再次连接。
28 
29     for sk in rlist:#表示rlist种有值,有返回的数据
30         chun_list=[]  #将返回的数据放到列表中
31         while True:
32             try:
33                 chun=sk.recv(1024)
34                 if not chun: #表示接收到的数据已经接收完,没有数据可接收了
35                     break
36                 chun_list.append(chun)  #有数据的话 将数据放入到列表中
37             except BlockingIOError as e:
38                 break
39         body=b''.join(chun_list)  #将列表中的数据以字节的形式展现出来
40         print('________>',body)
41         sk.close()
42         socket_list.remove(sk)
43     if not socket_list:
44         break
View Code
原文地址:https://www.cnblogs.com/mlhz/p/9641972.html