为什么python中对asyncio服务器的多个请求的时间会增加?

2024-09-30 22:14:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我用socket编写了一个pythonic服务器。它应该同时(并行)接收请求并并行地响应它们。 当我向它发送多个请求时,响应时间比我预期的要多。在

服务器:

import datetime
import asyncio, timeit
import json, traceback
from asyncio import get_event_loop

requestslist = []
loop = asyncio.get_event_loop()

async def handleData(reader, writer):
    message = ''
    clientip = ''
    data = bytearray()
    print("Async HandleData", datetime.datetime.utcnow())


    try:
        start = timeit.default_timer()
        data = await reader.readuntil(separator=b'\r\n\r\n')
        msg = data.decode(encoding='utf-8')
        len_csharp_message = int(msg[msg.find('content-length:') + 15:msg.find(';dmnid'):])
        data = await reader.read(len_csharp_message)
        message = data.decode(encoding='utf-8')

        clientip = reader._transport._extra['peername'][0]
        clientport = reader._transport._extra['peername'][1]
        print('\nData Received from:', clientip, ':', clientport)
        if (clientip, message) in requestslist:
            reader._transport._sock.close()

        else:
            requestslist.append((clientip, message))

            # adapter_result = parallel_members(message_dict, service, dmnid)
            adapter_result = '''[{"name": {"data": "data", "type": "str"}}]'''
            body = json.dumps(adapter_result, ensure_ascii=False)
            print(body)

            contentlen = len(bytes(str(body), 'utf-8'))
            header = bytes('Content-Length:{}'.format(contentlen), 'utf-8')
            result = header + bytes('\r\n\r\n{', 'utf-8') + body + bytes('}', 'utf-8')
            stop = timeit.default_timer()
            print('total_time:', stop - start)
            writer.write(result)
            writer.close()
        writer.close()
        # del writer
    except Exception as ex:
        writer.close()
        print(traceback.format_exc())
    finally:
        try:
            requestslist.remove((clientip, message))
        except:
            pass


def main(*args):
    print("ready")
    loop = get_event_loop()
    coro = asyncio.start_server(handleData, 'localhost', 4040, loop=loop, limit=204800000)
    srv = loop.run_until_complete(coro)
    loop.run_forever()


if __name__ == '__main__':
    main()

当我发送一个请求时,需要0.016秒。 但对于更多的要求,这次增加。在

cpu信息:英特尔至强x5650

客户:

^{pr2}$

对于这个同步发送12个请求的客户端,每个请求的总时间为0.15秒。在

我希望任何数量的请求,时间是固定的。在


Tags: importloopasynciomessageclosedatabodymsg
1条回答
网友
1楼 · 发布于 2024-09-30 22:14:22

什么是请求

单个请求(粗略地说)包括以下步骤:

  1. 向网络写入数据
  2. 浪费时间等待答案
  3. 从网络读取答案

?1/?3由CPU快速处理。第2步-是从你的电脑到某个服务器(例如在另一个城市)的字节传输,然后再通过电线返回:这通常需要更多的时间。在

异步请求如何工作

就处理而言,异步请求并不是真正的“并行”:仍然是您的单个CPU内核一次可以处理一件事情。但是运行多个异步请求允许您使用某个请求的第2步来执行其他请求的步骤1/3,而不是浪费大量时间。这就是为什么多个异步请求通常比相同数量的同步请求提前完成的原因。在

无网络延迟运行异步代码

但是,当你在本地运行时,第2步不会花太多时间:你的PC机和服务器是同一件事,字节不会进入网络旅程。在第2步中没有时间启动新请求。一次只能处理一件事。在

您应该针对响应延迟的服务器测试请求,以查看预期的结果。在

相关问题 更多 >