为什么要使用asyncio服务器作为上下文管理器并*调用serve_forever()?

时间:2019-06-03 09:37:16

标签: python python-asyncio

用于异步流的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),因此唯一的效果就是确保服务器已关闭。

看起来这些基本上在做同样的事情。为什么两个行都包含在示例中?最合理的实际应用程序是否可能同时包含这两者?

0 个答案:

没有答案