每个第一个连接上的python asyncio socket低速

时间:2017-09-02 12:16:10

标签: python performance sockets python-asyncio

我有使用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秒。

1 个答案:

答案 0 :(得分:0)

如果您查看read source,您会看到此部分:

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毫秒,这取决于您feed_data读者的protocol实施情况以及传输如何调用协议data_received

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

  1. 使用loop.set_debug(True)启用debug mode以查看是否 asyncio有话要说。
  2. 尝试使用debugger查看首次read来电时会发生什么。