一.简介
使用socket 阻塞通讯时,当程序调用recv() 方法从socket 中读取数据时,如果没有读取到数据时,当前线程将会被阻塞,因此为了解决这个问题采用了多线程的方式,制约了服务器高并发的访问。
selectors 模块允许socket 以非阻塞的方式进行通信,selectors 相当于事件注册中心,程序只要将所有事件注册给selectors 管理,当selectors 检测到socket 中的特定事件后,程序就调用相关的监听方法进行处理。
selectors 主要支持两种事件:
selectors.EVENT_READ:当socket 有数据可读时触发该事件。当客户端连接进来时也会触发该事件。
selectors.EVENT_WRITE:当socket将要写数据时触发该事件。
selectors 官方参考文档: https://docs.python.org/3.6/library/selectors.html
二.流程
1.server.py
import socket,selectors,threading
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(('localhost', 8080))
server.listen()
server.setblocking(False)
sel = selectors.DefaultSelector()
def accept(sock,mask):
print('accept------')
conn,addr = sock.accept()
conn.setblocking(False)
sel.register(conn,se