我有使用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秒。
答案 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,你使用自己的协议/传输,所以不可能说你是否在那里做事,但这里没有给你的建议:
loop.set_debug(True)
启用debug mode以查看是否
asyncio有话要说。read
来电时会发生什么。