selectors模块
这个模块允许高层和高效的I/O多路复用,建立在原语的选择模块
import selectors import socket sel = selectors.DefaultSelector() 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) def read(conn, mask): data = conn.recv(1000) # 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(('0.0.0.0', 9999)) sock.listen(100000) sock.setblocking(False) sel.register(sock, selectors.EVENT_READ, accept) while True: events = sel.select() for key, mask in events: callback = key.data callback(key.fileobj, mask)
import socket import sys messages = [b'This is the message. ', b'It will be sent ', b'in parts.'] server_address = ('localhost', 9999) # Create a TCP/IP socket socks = [socket.socket(socket.AF_INET, socket.SOCK_STREAM) for i in range(1000)] print('connecting to %s port %s' % server_address) for s in socks: s.connect(server_address) for message in messages: # 发送信息 for s in socks: print('%s: sending "%s"' % (s.getsockname(), message) ) s.send(message) # 读信息 for s in socks: data = s.recv(1024) print('%s: received "%s"' % (s.getsockname(), data)) if not data: print(sys.stderr, 'closing socket', s.getsockname())
浙公网安备 33010602011771号