1) Отличие этих 2-х результатов это "Data transferred:", второй вариант передал в 10 раз больше данных, значит больше работы - меньше rps - т.е. тесты не эквивалентны
2) если вам не надо ждать результат то не используйте await, тогда завершить запрос можно будет быстрее
в целом create_task не даст вам большую производительность, а асинхронный вызов не может занимать ни 3 ни 7 сек, скорее у вас код блокирующий или тормозной, и ни asyncio ни aiohttp тут не причем.
PS: asyncio + uvloop могут выдавать до 100к rps на среднем ноутбуке в один поток, поэтому не это причина ваших 150rps
--- тест asyncio + uvloop + httptools на среднем ноутбуке
Результат: 123krps, и max latency 6.74ms
Запуск wrk:
$ docker run --rm -it --network=host williamyeh/wrk -c 200 -d 10 http://localhost:8888/
Результат:
Running 10s test @ http://localhost:8888/
2 threads and 200 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 1.59ms 404.50us 6.74ms 58.61%
Req/Sec 62.18k 7.51k 74.02k 68.00%
1237743 requests in 10.06s, 47.22MB read
Requests/sec: 123044.52
Transfer/sec: 4.69MB
import asyncio
import uvloop
from httptools import HttpRequestParser
class RpcProtocol(asyncio.Protocol):
def connection_made(self, transport):
self.transport = transport
self.parser = HttpRequestParser(self)
def connection_lost(self, exc):
self.transport = None
def data_received(self, data):
self.parser.feed_data(data)
def on_message_complete(self):
#if self.url == b'/hello':
response = b'HTTP/1.1 200 OK\nContent-Length: 5\n\nHello'
self.transport.write(response)
if not self.parser.should_keep_alive():
self.transport.close()
self.transport = None
if __name__ == '__main__':
loop = uvloop.new_event_loop()
asyncio.set_event_loop(loop)
coro = loop.create_server(RpcProtocol, '127.0.0.1', 8888)
loop.run_until_complete(coro)
loop.run_forever()
loop.close()