summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>2013-11-29 22:51:18 (GMT)
committerGuido van Rossum <guido@python.org>2013-11-29 22:51:18 (GMT)
commit8519e5ade69abc8cba158178ac1e777488e4dccb (patch)
tree9b26e8dc76e50f287e31a4542f12beac322bfddd
parent16d970f8177ea67e80b39361c282fa0bb2a9ced7 (diff)
downloadcpython-8519e5ade69abc8cba158178ac1e777488e4dccb.zip
cpython-8519e5ade69abc8cba158178ac1e777488e4dccb.tar.gz
cpython-8519e5ade69abc8cba158178ac1e777488e4dccb.tar.bz2
More realistic example for selectors.py.
-rw-r--r--Doc/library/selectors.rst67
1 files changed, 37 insertions, 30 deletions
diff --git a/Doc/library/selectors.rst b/Doc/library/selectors.rst
index a6df909..44835fa 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=<socket.socket fd=4, family=AddressFamily.AF_UNIX, type=2049, proto=0>, fd=4, events=1, data=None)
- >>> s.register(w, selectors.EVENT_WRITE)
- SelectorKey(fileobj=<socket.socket fd=5, family=AddressFamily.AF_UNIX, type=2049, proto=0>, fd=5, events=2, data=None)
- >>>
- >>> print(s.select())
- [(SelectorKey(fileobj=<socket.socket fd=5, family=AddressFamily.AF_UNIX, type=2049, proto=0>, 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)