最大化并行请求数 (aiohttp)

2023-11-27

tl;dr:如何最大化可以并行发送的 http 请求数量?

我正在从多个网址获取数据aiohttp图书馆。我正在测试它的性能,我发现在这个过程中的某个地方存在瓶颈,一次运行更多的网址并没有帮助。

我正在使用这段代码:

import asyncio
import aiohttp

async def fetch(url, session):
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:64.0) Gecko/20100101 Firefox/64.0'}
    try:
        async with session.get(
            url, headers=headers, 
            ssl = False, 
            timeout = aiohttp.ClientTimeout(
                total=None, 
                sock_connect = 10, 
                sock_read = 10
            )
        ) as response:
            content = await response.read()
            return (url, 'OK', content)
    except Exception as e:
        print(e)
        return (url, 'ERROR', str(e))

async def run(url_list):
    tasks = []
    async with aiohttp.ClientSession() as session:
        for url in url_list:
            task = asyncio.ensure_future(fetch(url, session))
            tasks.append(task)
        responses = asyncio.gather(*tasks)
        await responses
    return responses

loop = asyncio.get_event_loop()
asyncio.set_event_loop(loop)
task = asyncio.ensure_future(run(url_list))
loop.run_until_complete(task)
result = task.result().result()

运行这个url_list不同长度(测试https://httpbin.org/delay/2)我发现,添加更多要同时运行的 url 最多只能帮助大约 100 个 url,然后总时间开始与 url 数量成比例增长(或者换句话说,每个 url 的时间不会减少)。这表明尝试立即处理这些内容时会失败。此外,随着“一批”中的网址增多,我偶尔会收到连接超时错误。

enter image description here

  • 为什么会发生这种情况?究竟是什么限制了speed here?
  • 我怎样才能检查什么是maximum我可以在给定计算机上发送的并行请求数? (我的意思是一个确切的数字 - 不是上面通过“反复试验”得出的近似值)
  • 我能做什么increase一次处理的请求数量?

我在 Windows 上运行这个。

EDIT回复评论:

这是相同的数据,限制设置为None。最后只有轻微的改善,并且一次发送 400 个 url 时出现许多连接超时错误。我最终使用了limit = 200根据我的实际数据。

enter image description here


默认情况下aiohttp将同时连接数限制为100。它通过设置默认值来实现limit to TCPConnector object被使用的是ClientSession。您可以通过创建自定义连接器并将其传递给会话来绕过它:

connector = aiohttp.TCPConnector(limit=None)
async with aiohttp.ClientSession(connector=connector) as session:
    # ...

但请注意,您可能不想将此数字设置得太高:您的网络容量、CPU、RAM 和目标服务器都有自己的限制,尝试建立大量连接可能会导致失败增加。

最佳数量可能只能通过在混凝土机器上进行实验才能找到。


无关:

您无需创建任务reason。大多数 asyncio api 接受常规协程。例如,您的最后一行代码可以这样更改:

loop = asyncio.get_event_loop()
loop.run_until_complete(run(url_list))

或者甚至只是asyncio.run(run(url_list)) (doc)如果您使用的是 Python 3.7

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

最大化并行请求数 (aiohttp) 的相关文章

随机推荐

  • 更改 Django autocomplete_fields 标签

    我正在尝试为以下类型的所有项目设置自定义标签autocomplete fields 到目前为止 对于下拉列表 人们会使用 class CustomDisplay forms ModelChoiceField def label from i
  • 检测对蓝牙适配器所做的状态更改?

    我有一个带有按钮的应用程序 我用它来打开和关闭 BT 我在那里有以下代码 public void buttonFlip View view flipBT buttonText view public void buttonText View
  • Ant:如何从命令行传入的逗号分隔列表中设置属性?

    我正在使用 Ant 1 8 1 如果我在命令行上传递一个参数 DenableProperties abc def ghi jkl 如何在 Ant 脚本中设置各个属性 true false
  • web.configallowDefinition=MachineToApplication 错误

    在根目录下我有以下结构 web config Report Folder Login aspx Web config gt ViewReport gt Report aspx 在 Report 文件夹中的 web config 文件中 我有
  • Django - 如何防止数据库外键约束创建

    我有一个由数据库视图支持的模型 class OrgCode models Model org code models CharField db column u code max length 15 org description mode
  • JNA UnsatisfiedLinkError - 当我将 java.library.path 设置为虚假值时起作用

    在 Linux 上使用 JNA 4 0 0 我尝试加载本机库 libmean so 这是在lib子目录 该库只是一个计算两个数字平均值的简单示例 我运行以下代码 在 Eclipse 中 Djna library path lib在运行配置中
  • 未记录的 CONVERT 样式 - 日期时间 23

    最近我偶然发现CONVERT函数样式 23 这非常方便 因为它为您提供 DATE 格式yyyy mm dd 问题是msdn中没有记录 在 CONVERT 上 F1 后来自 SSMS 帮助的链接 http msdn microsoft com
  • c# 以编程方式从 Exchange 服务器读取电子邮件

    当您在网络上搜索时 您会找到 如何以编程方式阅读电子邮件 的非常简单的答案 所有网站都解释了大部分与此页面相同的内容 http omegacoder com p 454 depends from Exchange server versio
  • UIFileSharingEnabled 仅在调试变体上

    我正在寻找一种方法来仅为调试变体启用 UIFileSharingEnabled 标志 这样我就可以更改文档文件夹的内容 但我不希望最终用户做同样的事情 我想我可以使用运行脚本来执行此操作 但不确定如何获取脚本的活动配置名称 解决了 if C
  • 异步的替代方案: false ajax

    我循环遍历一个数组 为每个数组运行 ajax 请求 我需要请求按顺序发生 这样我就可以接收最后一个请求并在成功时运行一个函数 目前我正在运行 简化 each array function i item ajax request item i
  • 中 ANYSIZE_ARRAY 的用途是什么?

    目的是什么ANYSIZE ARRAY 位于WinNT h 我在 2004 年看到一篇关于它的 MSDN 博客文章 但它对我来说没有意义 我假设你正在谈论这篇博文 当可变大小 编译时未知 数组是结构的一部分时 通常使用它 typedef st
  • SQL 视图上的 LINQ select 得到错误答案

    我有一个 SQL 视图 它生成 8 列的响应 它相当复杂 所以我不会在这里列出它 它不会对我试图理解的问题增加太多内容 当我直接使用此查询在 SQL Manager 中查询视图时 SELECT FROM GPPS dbo PartIndex
  • 如何将 R 对象的定义导出为纯文本以便其他人可以重新创建它?

    假设您在 R 中有这些数据 并且您想在 stackoverflow 上发布问题 为了让其他人能够最好地帮助您 如果他们能够拥有您的对象 数据框 矢量等 的副本来使用 那就太好了 假设您的数据位于名为 site data 的数据框中 gt s
  • 了解 Java 泛型中的通配符

    我不确定为什么以下代码中的最后一条语句是非法的 Integer应该是一个子类型 那么为什么我不能将它分配给b List
  • 在 matlab 中绘制一堆 3d 线的最有效方法

    我需要在 matlab 中绘制 3d 线列表 最快的方法是什么 我目前正在做类似的事情 edges is a MX2 matrix holding the list of edges points are the vertices coor
  • 在php/mysql中导入带有图像的excel文件

    我想制作一个导入脚本 允许用户将他们的 excel 文件 扩展名不重要 上传到我的 php 应用程序 应用程序应该识别一个项目列表 到目前为止一切顺利 这种情况下的困难在于 Excel 文件包含图像 我已阅读有关 phpexcel 库的信息
  • 使用 HTML5 将 1000 条记录插入 sqlite 时如何加快处理速度

    我是 HTML5 应用程序开发新手 在此 我想使用 HTML5 将 1000 条记录插入到 sqlite 数据库中 这个过程非常缓慢 如何在插入记录之前使用 BEGIN COMMIT 这样可以加快插入速度 请任何人指导我 提前致谢 请在ch
  • 反编译 APK 并在您的应用程序中使用其部分代码是否合法

    反编译 apk 并使用其部分代码是否合法 更具体地说 一个 URL 连接器 我还没学过 应用程序的其余部分 布局等 是我制作的 我可以发布此应用程序而不用担心法律问题吗 不管骗子说什么 反编译绝对合法 最多 您可能会因与软件相关的未经授权的
  • MySQL 是否有与 PHP 的 preg_replace 等效的工具?

    我有一个匹配 MySQL 中的字段 我认为我可以使用正则表达式 但 MySQL 似乎没有完成这项工作所需的功能 这是场景 我在 PHP 中有一个名为 url 的变量 假设此变量设置为字符串 article my article page 2
  • 最大化并行请求数 (aiohttp)

    tl dr 如何最大化可以并行发送的 http 请求数量 我正在从多个网址获取数据aiohttp图书馆 我正在测试它的性能 我发现在这个过程中的某个地方存在瓶颈 一次运行更多的网址并没有帮助 我正在使用这段代码 import asyncio