#!/usr/bin/env python # -*- coding:utf-8 -*- # author: Changhua Gong import selectors import socket sel = selectors.DefaultSelector() '''selectors根據系統自動select或epoll''' def accept(sock, mask): conn, addr = sock.accept() # Should be ready print('accepted', conn, 'from', addr) conn.setblocking(False) # 設置鏈接不阻塞 sel.register(conn, selectors.EVENT_READ, read) # 新鏈接註冊read回調函數 def read(conn, mask): data = conn.recv(1024) # Should be ready if data: print('echoing', repr(data), 'to', conn) conn.send(data) # Hope it won't block else: print('closing', conn) sel.unregister(conn) conn.close() sock = socket.socket() sock.bind(('localhost', 10000)) sock.listen(100) sock.setblocking(False) sel.register(sock, selectors.EVENT_READ, accept) # 註冊sock,有鏈接進來則調用accept while True: events = sel.select() # 默認阻塞,有活動鏈接就返回活動的鏈接列表 for key, mask in events: callback = key.data # accept的內存地址或read的內存地址,即等於read或accept函數 callback(key.fileobj, mask) # 調用對應的回調函數,key.fileobj爲文件句柄