【问题标题】:python asyncio socket low speed on every first connectionpython asyncio socket在每个第一个连接上都低速
【发布时间】:2017-09-02 12:16:09
【问题描述】:

我有一个使用 asyncio python 模块的 python 异步 Web 服务器。

启动服务器的第一部分代码是:

def handleData(reader, writer): 
    time_list=[]
    total_start=time.time()

    print(reader._transport._extra['peername'][0]+':'+str(reader._transport._extra['peername'][1]))
    message=''
    clientip=''
    data=bytearray()    
    start=time.time()
    data=yield from reader.read(1024)
    time2=time.time()-start        
    time_list.append(['Time2',str(time2)])              
    message=data.decode(encoding='utf-8')    
    if message=='':
        return


    if '\r\n\r\n' not in message:
        while '\r\n\r\n' not in message:
            data=yield from reader.read(1024)
            message+=data.decode(encoding='utf-8')

    retval=header(message)    


def main():               
    loop = get_event_loop()
    coro = loop.create_server(ServerClientProtocol, '127.0.0.1', 80)
    srv = loop.run_until_complete(coro)
    loop.run_forever()

if __name__ == '__main__':
    main()

在我的代码的不同区域搜索并放置时间计算后,我发现获取的第一行 来自客户端的套接字数据是最低且最耗时的部分( data=yield from reader.read(1024) ) (time2=time.time()-start) 行之前的行。

有什么问题?我不明白为什么它这么低而且 eveytime 得到 3-4 秒,但其他部分只有 100 毫秒。

【问题讨论】:

  • 还是没人愿意回答吗?这可能是 asyncio 库文档很差吗?
  • 你好,请回答:(((((((()
  • 无法复制
  • @AndrewSvetlov 我不明白。你能解释一下吗?

标签: python performance sockets python-asyncio


【解决方案1】:

如果你看一下readsource,你会看到这个部分:

if not self._buffer and not self._eof:
    yield from self._wait_for_data('read')

# This will work right even if buffer is less than n bytes
data = bytes(self._buffer[:n])
del self._buffer[:n]

read 可能实际上只有在第一次调用以填充_buffer 并在进一步调用时才返回其中的一部分后才能完成一些工作。它可以解释为什么第一个read 调用比其他调用更消耗。

我不知道等待_wait_for_data 100 毫秒是否正常,这取决于您的读者如何实现protocolfeed_data 以及传输如何调用协议的data_received

Afaiu,您使用自己的协议/传输,所以不可能说您是否在那里做事,但这里给您一些建议:

  1. 启用debug modeloop.set_debug(True) 看看是否 asyncio 有话要告诉你。
  2. 尝试使用 debugger 来查看第一次调用 read 时会发生什么。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-12
    • 1970-01-01
    • 2013-10-20
    • 1970-01-01
    • 2016-12-14
    • 1970-01-01
    • 2013-06-24
    相关资源
    最近更新 更多