selectors的简单使用
用selectors实现并发
1 import selectors 2 import socket 3 4 def accept(sk, mash): 5 # 获取另一个连接对象 6 conn, addr = sk.accept() 7 conn.setblocking(False) 8 sel.register(conn, selectors.EVENT_READ, read) 9 10 def read(conn, mash): 11 # 收发消息 12 # 几乎所有的逻辑操作都在这个函数中实现 13 try: 14 data = conn.recv(1024) 15 if not data: return 16 conn.send(b"hello world") 17 except Exception as e: 18 print(e) 19 sel.unregister(conn) 20 conn.close() 21 22 if __name__ == '__main__': 23 # 获取selectors对象 24 sel = selectors.DefaultSelector() 25 26 # 获取socket对象 27 sk = socket.socket() 28 sk.bind((socket.gethostname(), 8080)) 29 sk.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 30 sk.listen(10) 31 # 将sk设为非阻塞的 32 sk.setblocking(False) 33 34 # 注册sk使其与accept绑定 35 sel.register(sk, selectors.EVENT_READ, accept) 36 37 while True: 38 # 监听,超时时间设为0.2秒 39 events = sel.select(0.2) 40 for key, mash in events: 41 callback = key.data 42 # 触发对应的事件 43 callback(key.fileobj, mash) 44 # for循环之后为超时时间内可操作的语句
浙公网安备 33010602011771号