【问题标题】:How do I determine the number of requests per second using aiohttp?如何使用 aiohttp 确定每秒的请求数?
【发布时间】:2017-02-02 19:25:29
【问题描述】:

我正在尝试使用aiohttp 创建一个网络流量模拟器。以下代码示例异步发出 10k 个请求。我想知道其中有多少是同时发生的,所以我可以说这模拟了 10k 个同时请求网站的用户。

如何确定并发网络请求的数量或如何确定 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))

【问题讨论】:

    标签: python python-3.x async-await python-asyncio aiohttp


    【解决方案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)
    

    如果你修复了这个错误,你会得到你想要的——所有的请求都会同时开始。

    除非使用 Semaphore / Queue,否则您将破坏服务。

    无论如何,如果这是你想要的,你可以使用这个:

    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 以更好地了解协程的工作原理。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-16
      • 1970-01-01
      • 2012-06-23
      • 1970-01-01
      相关资源
      最近更新 更多