用于异步流的Python 3.7文档包括TCP echo server example:
import asyncio
async def handle_echo(reader, writer):
data = await reader.read(100)
message = data.decode()
addr = writer.get_extra_info('peername')
print(f"Received {message!r} from {addr!r}")
print(f"Send: {message!r}")
writer.write(data)
await writer.drain()
print("Close the connection")
writer.close()
async def main():
server = await asyncio.start_server(
handle_echo, '127.0.0.1', 8888)
addr = server.sockets[0].getsockname()
print(f'Serving on {addr}')
async with server:
await server.serve_forever()
asyncio.run(main())
这是我特别感兴趣的片段:
async with server:
await server.serve_forever()
所以我们正在做两件事:
asyncio.Server
作为上下文管理器,为此(从该页面)“确保async with语句完成后,服务器对象已关闭并且不接受新连接”。Server.serve_forever()
。这通常会开始侦听(如果尚未启动),并确保在取消协程时关闭服务器。在到达这些行时,我们已经调用了start_server
(默认为start_serving=True
),因此唯一的效果就是确保服务器已关闭。看起来这些基本上在做同样的事情。为什么两个行都包含在示例中?最合理的实际应用程序是否可能同时包含这两者?