Как определить количество запросов в секунду с помощью aiohttp?

Я пытаюсь создать симулятор веб-трафика, используя aiohttp, В следующем примере кода асинхронно выполняется 10 тыс. Запросов. Я хочу знать, сколько из них происходит одновременно, поэтому я могу сказать, что это моделирует 10 тысяч пользователей, запрашивающих веб-сайт одновременно.

Как определить количество одновременных сетевых запросов или как определить количество запросов в секунду, выполняемых aiohttp? Есть ли способ отладки / профилирования количества одновременных запросов в реальном времени?

Есть ли лучший способ для моделирования симулятора веб-трафика с использованием любого другого языка программирования?

import asyncio
import aiohttp

async def fetch(session, url):
  with aiohttp.Timeout(10, loop=session.loop):
      async with session.get(url) as response:
            return await response.text()

async def run(r):
    url = "http://localhost:3000/"
    tasks = []

    # Create client session that will ensure we dont open new connection
    # per each request.
    async with aiohttp.ClientSession() as session:
        for i in range(r):
          html = await fetch(session, url)
          print(html)


# make 10k requests per second ?? (not confident this is true)
number = 10000
loop = asyncio.get_event_loop()
loop.run_until_complete(run(number))

1 ответ

Привет сначала есть ошибка в оригинальном коде:

async with aiohttp.ClientSession() as session:
    for i in range(r):
      # This line (the await part) makes your code wait for a response
      # This means you done 1 concurent request
      html = await fetch(session, url)

Если вы исправите ошибку, вы получите то, что хотели - все запросы начнутся одновременно.

Вы собираетесь забить сервис - если только не используете Семафор / Очередь.

в любом случае, если это то, что вы хотите, вы можете использовать это:

import asyncio
import aiohttp
import tqdm


async def fetch(session, url):
    with aiohttp.Timeout(10, loop=session.loop):
        async with session.get(url) as response:
            return await response.text()


async def run(r):
    url = "http://localhost:3000/"
    tasks = []
    # The default connection is only 20 - you want to stress...
    conn = aiohttp.TCPConnector(limit=1000)
    tasks, responses = [], []
    async with aiohttp.ClientSession(connector=conn) as session:
        tasks = [asyncio.ensure_future(fetch(session, url)) for _ in range(r)]
        #This will show you some progress bar on the responses 
        for f in tqdm.tqdm(asyncio.as_completed(tasks), total=len(tasks)):
            responses.append(await f)
    return responses

number = 10000
loop = asyncio.get_event_loop()
loop.run_until_complete(run(number))

Благодаря asyncio aiohttp индикатор выполнения с tqdm для tqdm:)

Я также предлагаю прочитать https://pawelmhm.github.io/asyncio/python/aiohttp/2016/04/22/asyncio-aiohttp.html чтобы лучше понять, как работают сопрограммы.

Другие вопросы по тегам