From 8519e5ade69abc8cba158178ac1e777488e4dccb Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Fri, 29 Nov 2013 14:51:18 -0800 Subject: [PATCH] More realistic example for selectors.py. --- Doc/library/selectors.rst | 67 +++++++++++++++++++++------------------ 1 file changed, 37 insertions(+), 30 deletions(-) diff --git a/Doc/library/selectors.rst b/Doc/library/selectors.rst index a6df909364..44835fa337 100644 --- a/Doc/library/selectors.rst +++ b/Doc/library/selectors.rst @@ -210,33 +210,40 @@ below: :func:`select.kqueue` object. -Examples of selector usage:: - - >>> 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() +Examples +-------- + +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) -- 2.40.0