【问题标题】:Asyncio server stops to respond after the first requestAsyncio 服务器在第一次请求后停止响应
【发布时间】:2021-02-08 23:59:32
【问题描述】:

我正在尝试编写一个基于异步的服务器。问题是,它在第​​一次请求后停止响应。

我的代码基于this template for echo-serverthis method to pass parameters to coroutines

class MsgHandler:

    def __init__(self, mem):
        # here (mem:dict) I store received metrics
        self.mem = mem

    async def handle(self, reader, writer):
        #this coroutine handles requests
        data = await reader.read(1024)
        print('request:', data.decode('utf-8'))
        # read_msg returns an answer based on the request received
        # My server closes connection on every second request
        # For the first one, everything works as intended,
        # so I don't thik the problem is in read_msg()
        response = read_msg(data.decode('utf-8'), self.mem)
        print('response:', response)
        writer.write(response.encode('utf-8'))
        await writer.drain()
        writer.close()


def run_server(host, port):
    mem = {}
    msg_handler = MsgHandler(mem)

    loop = asyncio.get_event_loop()
    coro = asyncio.start_server(msg_handler.handle, host, port, loop=loop)
    server = loop.run_until_complete(coro)

    try:
        loop.run_forever()
    except KeyboardInterrupt:
        pass

    server.close()
    loop.run_until_complete(server.wait_closed())
    loop.close()

在客户端,我得到一个空响应或 ConnectionResetError(104,'Connection reset by peer')。

【问题讨论】:

  • 无法重现。您能否分享您的响应示例,或使示例代码可运行和可重现?

标签: python-3.x python-asyncio


【解决方案1】:

您正在处理程序中使用writer.close() 关闭编写器,这会关闭套接字。

来自StreamWriter 上的 3.9 文档:

此外,如果您不关闭流编写器,那么您仍会将其存储在某个地方,以便继续通过同一连接接收消息。

【讨论】:

    猜你喜欢
    • 2021-04-02
    • 1970-01-01
    • 1970-01-01
    • 2012-07-08
    • 1970-01-01
    • 2020-04-02
    • 1970-01-01
    • 2018-12-08
    • 2015-05-01
    相关资源
    最近更新 更多