diff -r a1a936a3b2f6 Doc/library/selectors.rst --- a/Doc/library/selectors.rst Fri Nov 29 18:57:47 2013 +0100 +++ b/Doc/library/selectors.rst Fri Nov 29 23:44:50 2013 +0100 @@ -210,33 +210,41 @@ :func:`select.kqueue` object. -Examples of selector usage:: +Examples +-------- - >>> import selectors - >>> import socket - >>> - >>> s = selectors.DefaultSelector() - >>> r, w = socket.socketpair() - >>> - >>> r.setblocking(False) - >>> w.setblocking(False) - >>> - >>> s.register(r, selectors.EVENT_READ) - SelectorKey(fileobj=, fd=4, events=1, data=None) - >>> s.register(w, selectors.EVENT_WRITE) - SelectorKey(fileobj=, fd=5, events=2, data=None) - >>> - >>> print(s.select()) - [(SelectorKey(fileobj=, fd=5, events=2, data=None), 2)] - >>> - >>> for key, events in s.select(): - ... if events & selectors.EVENT_WRITE: - ... key.fileobj.send(b'spam') - ... - 4 - >>> for key, events in s.select(): - ... if events & selectors.EVENT_READ: - ... print(key.fileobj.recv(1024)) - ... - b'spam' - >>> s.close() +Here is a simple echo server implementation:: + + 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(('localhost', 1234)) + sock.listen(100) + 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)