码迷,mamicode.com
首页 > 编程语言 > 详细

Python IO多路复用

时间:2019-09-14 10:55:58      阅读:79      评论:0      收藏:0      [点我收藏+]

标签:erro   select   多个   io多路复用   创建   except   false   dal   获得   

IO多路复用

多个socket是否已经发生变化,(是否已经连接成功/是否已经获得数据)(可读/可写)

实现:

  1. IO多路复用
  2. 非阻塞

代码如下:

import socket
import select

client1 = socket.socket()
client1.setblocking(False) # 将原本链接阻塞,修改为非阻塞
# 百度创建链接,阻塞
try:
    client1.connect(('www.baidu.com',80))
except BlockingIOError:
    pass

client2 = socket.socket()
client2.setblocking(False) # 将原本链接阻塞,修改为不阻塞
# 百度创建链接,阻塞
try:
    client2.connect(('www.sogou.com',80))
except BlockingIOError:
    pass

client3 = socket.socket()
client3.setblocking(False) # 将原本链接阻塞,修改为不阻塞
# 百度创建链接,阻塞
try:
    client3.connect(('www.oldboyedu.com',80))
except BlockingIOError:
    pass

socket_list = [client1,client2,client3]
conn_list = [client1,client2,client3]

while True:
    rlist,wlist,elist = select.select(socket_list,conn_list,[],0.005)

    for sk in wlist:
        if sk == client1:
            sk.sendall(b'GET /s?wd=alex HTTP/1.0\r\nhost:www.baidu.com\r\n\r\n')
        elif sk == client2:
            sk.sendall(b'GET /web?query=alex HTTP/1.0\r\nhost:www.sogou.com\r\n\r\n')
        else:
            sk.sendall(b'GET /s?wd=alex HTTP/1.0\r\nhost:www.oldboyedu.com\r\n\r\n')
        conn_list.remove(sk)

    for sk in rlist:
        chunk_list = []
        while True:
            try:
                chunk = sk.recv(8096)
                if not chunk:
                    break
                chunk_list.append(chunk)
            except BlockingIOError:
               break

        boby = b''.join(chunk_list)
        print('------->',boby)
        sk.close()
        socket_list.remove(sk)

    if not socket_list:
        break

Python IO多路复用

标签:erro   select   多个   io多路复用   创建   except   false   dal   获得   

原文地址:https://www.cnblogs.com/Hybb/p/11518411.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!