gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 11:55:07 27 4
gpt4 key购买 nike

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

最佳答案

如果你看看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通话比其他人更消耗。

不知道等待|100ms是不是正常情况 _wait_for_data ,这取决于如何实现 protocolfeed_data您的读者以及传输如何调用协议(protocol)的 data_received .

Afaiu,你使用自己的协议(protocol)/传输,所以不可能说你是否在那里做事,但这里有一些建议给你:
  • 启用 debug modeloop.set_debug(True)看看是否
    asyncio 有话要告诉你。
  • 尝试使用debugger看看第一个会发生什么read称呼。
  • 关于python asyncio socket在每个第一个连接上都低速,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46013685/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com