asyncio doc: explain why the loop is running twice
diff --git a/Doc/library/asyncio-protocol.rst b/Doc/library/asyncio-protocol.rst
index ae519e7..c371c56 100644
--- a/Doc/library/asyncio-protocol.rst
+++ b/Doc/library/asyncio-protocol.rst
@@ -582,45 +582,6 @@
Protocol example: TCP echo server and client
============================================
-Echo server
------------
-
-TCP echo server example, send back received data and close the connection::
-
- import asyncio
-
- class EchoServer(asyncio.Protocol):
- def connection_made(self, transport):
- peername = transport.get_extra_info('peername')
- print('connection from {}'.format(peername))
- self.transport = transport
-
- def data_received(self, data):
- print('data received: {}'.format(data.decode()))
- self.transport.write(data)
-
- # close the socket
- self.transport.close()
-
- loop = asyncio.get_event_loop()
- task = loop.create_server(EchoServer, '127.0.0.1', 8888)
- server = loop.run_until_complete(task)
- print('serving on {}'.format(server.sockets[0].getsockname()))
-
- try:
- loop.run_forever()
- except KeyboardInterrupt:
- print("exit")
- finally:
- server.close()
- loop.close()
-
-:meth:`Transport.close` can be called immediatly after
-:meth:`WriteTransport.write` even if data are not sent yet on the socket: both
-methods are asynchronous. ``yield from`` is not needed because these transport
-methods don't return coroutines.
-
-
Echo client
-----------
@@ -643,8 +604,54 @@
asyncio.get_event_loop().stop()
loop = asyncio.get_event_loop()
- task = loop.create_connection(EchoClient, '127.0.0.1', 8888)
- loop.run_until_complete(task)
+ coro = loop.create_connection(EchoClient, '127.0.0.1', 8888)
+ loop.run_until_complete(coro)
loop.run_forever()
loop.close()
+The event loop is running twice. The
+:meth:`~BaseEventLoop.run_until_complete` method is preferred in this short
+example to raise an exception if the server is not listening, instead of
+having to write a short coroutine to handle the exception and stop the
+running loop. At :meth:`~BaseEventLoop.run_until_complete` exit, the loop is
+no more running, so there is no need to stop the loop in case of an error.
+
+Echo server
+-----------
+
+TCP echo server example, send back received data and close the connection::
+
+ import asyncio
+
+ class EchoServer(asyncio.Protocol):
+ def connection_made(self, transport):
+ peername = transport.get_extra_info('peername')
+ print('connection from {}'.format(peername))
+ self.transport = transport
+
+ def data_received(self, data):
+ print('data received: {}'.format(data.decode()))
+ self.transport.write(data)
+
+ # close the socket
+ self.transport.close()
+
+ loop = asyncio.get_event_loop()
+ coro = loop.create_server(EchoServer, '127.0.0.1', 8888)
+ server = loop.run_until_complete(coro)
+ print('serving on {}'.format(server.sockets[0].getsockname()))
+
+ try:
+ loop.run_forever()
+ except KeyboardInterrupt:
+ print("exit")
+ finally:
+ server.close()
+ loop.close()
+
+:meth:`Transport.close` can be called immediatly after
+:meth:`WriteTransport.write` even if data are not sent yet on the socket: both
+methods are asynchronous. ``yield from`` is not needed because these transport
+methods don't return coroutines.
+
+