Python 3.x 激发大量HTTP请求并在不等待请求的情况下终止

Python 3.x 激发大量HTTP请求并在不等待请求的情况下终止,python-3.x,http,python-asyncio,Python 3.x,Http,Python Asyncio,对于一些测试,我想触发大量(约10000)HTTP GET请求 我对回复不感兴趣,也不希望我的应用程序挂起等待回复,以便尽快完成。由于这个原因,我尝试使用请求库是非常糟糕的: import requests def fire(urls, params): for url in urls: for param in params: requests.get(url, params=param) 如何在不等待或处理响应的情况下发送大量HTTP请求?

对于一些测试,我想触发大量(约10000)HTTP GET请求

我对回复不感兴趣,也不希望我的应用程序挂起等待回复,以便尽快完成。由于这个原因,我尝试使用
请求
库是非常糟糕的:

import requests

def fire(urls, params):
    for url in urls:
        for param in params:
            requests.get(url, params=param)

如何在不等待或处理响应的情况下发送大量HTTP请求?

您可以使用
aiohttp
并行触发多个请求,然后是
asyncio.wait\u for()


您可以使用
aiohttp
并行触发多个请求,后跟
asyncio.wait_for()


许多好的问题都会根据专家经验产生一定程度的意见,但对这个问题的回答往往几乎完全基于意见,而不是事实、参考资料或特定的专业知识。@Rob将此改为询问“如何”而不是“最佳方法”。许多好的问题都会根据专家经验产生一定程度的意见,但这个问题的答案几乎完全是基于观点,而不是事实、参考资料或特定的专业知识。@Rob出于兴趣(并为了读者的利益)将其改为“如何”而不是“最佳方法”,这是否会在收到每个问题后立即开始请求,并依赖操作系统限制,或者,它是否能有效地在特定数量的连接处于活动状态后对连接进行排队?@halfer没有排队,但可以使用所描述的基于
信号量的技术轻松添加。好的,谢谢。因此,如果服务器操作系统的创建速度快于完成速度,那么服务器操作系统必须处理连接计数溢出?我认为现代服务器可以同时跟踪数千台,但一定有一点它拒绝打开另一台。@halfer OP没有指定,但我有点假设连接到许多不同的服务器,例如测试网络。在大多数情况下,同时创建数千个连接是一个坏主意,但也有合法的用例,比如压力测试。这个答案只是一个起点,而不是一个完整的解决方案。@halfer是的。由于代码完全是幼稚的,如果你给它太多的URL,它将开始引发异常(这可以而且可能应该在
one
中捕获)。最有可能的第一个错误来自超过最大文件描述符计数。出于兴趣(为了读者的利益),这是在收到每个请求后立即启动请求并依赖操作系统限制,还是在特定数量的连接已处于活动状态后有效地排队?@halfer没有排队,但是可以使用所描述的基于
信号量的技术轻松添加它。好的,谢谢。因此,如果服务器操作系统的创建速度快于完成速度,那么服务器操作系统必须处理连接计数溢出?我认为现代服务器可以同时跟踪数千台,但一定有一点它拒绝打开另一台。@halfer OP没有指定,但我有点假设连接到许多不同的服务器,例如测试网络。在大多数情况下,同时创建数千个连接是一个坏主意,但也有合法的用例,比如压力测试。这个答案只是一个起点,而不是一个完整的解决方案。@halfer是的。由于代码完全是幼稚的,如果你给它太多的URL,它将开始引发异常(这可以而且可能应该在
one
中捕获)。最有可能的第一个错误来自超过最大文件描述符计数。
import asyncio
import aiohttp

async def one(session, url):
    # request the URL and read it until complete or canceled
    async with session.get(url) as resp:
        await resp.text()

async def fire(urls):
    loop = asyncio.get_event_loop()
    async with aiohttp.ClientSession() as session:
        tasks = []
        for url in urls:
            tasks.append(loop.create_task(one(session, url)))

        # give tasks a second to run in parallel and do their thing,
        # then cancel them
        try:
            await asyncio.wait_for(asyncio.gather(*tasks), 1)
        except asyncio.TimeoutError:
            pass

loop = asyncio.get_event_loop()
loop.run_until_complete(fire([urls...]))