2017-02-02 12 views
2

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

Как определить количество одновременных сетевых запросов или как определить, сколько запросов в секунду производится с помощью 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 progress bar with tqdm для tqdm :)

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

 Смежные вопросы

  • Нет связанных вопросов^_^