IO多路复用
使用python内置模块select实现socket IO多路复用:
import socket
import select
sk = socket.socket()
sk.bind(('127.0.0.1',8080))
sk.setblocking(False)
sk.listen(5)
read_lst = [sk]
while True:
r_lst,w_lst,x_lst = select.select(read_lst,[],[])
for i in r_lst:
if i is sk:
conn,addr = i.accept()
read_lst.append(conn)
else:
ret = i.recv(1024)
if ret == b'':
i.close()
read_lst.remove(i)
continue
print(ret)
i.send(b'goodbye!')
import socket
import time
from threading import Thread
def func():
sk = socket.socket()
sk.connect(('127.0.0.1',8080))
sk.send(b'hello')
time.sleep(3)
print(sk.recv(1024))
if __name__ == '__main__':
for i in range(20):
t = Thread(target=func)
t.start()