【问题标题】:How to max out bandwidth using concurrent requests?如何使用并发请求最大化带宽?
【发布时间】:2016-08-19 16:37:15
【问题描述】:

我想向网络服务器发送大约 6e6 个发布请求。只有在没有重定向状态代码的情况下才会获取内容。 当遍历提供重定向的一段数据时会出现问题;带宽使用率非常低!(例如可用带宽的 10 %。)

我先使用multiprocessing.dummy 模块,然后切换到使用asyncio,但即便如此,请求也不会使用整个带宽。

注意

尽管this 确实是问题所在,但我不懂 Go ,所以,我在这里询问了 Python 的解决方案。 This 不是我想问的问题,我通过一次处理数据子集来解决这个问题。

【问题讨论】:

  • 您确定该网站会在不限制或将您列入黑名单的情况下实际回复您的 600 万次请求吗?
  • @user2357112 不,这个网站真的很蠢。

标签: python python-3.5 python-multithreading python-asyncio aiohttp


【解决方案1】:

哦,它甚至可能与编程无关。 6e6真的很多,所以网卡不好也可能会被限制。 解决方案是尝试压力测试实用程序来确定您的硬件是否可以每秒发送该数量的请求。 例如,使用ab ApacheBench 实用程序,例如: ab -kc 6000000 -n 1000 http://your-site.com

【讨论】:

  • 是的 6e6 非常多,但我一次可以处理 1000-2000 个请求(我尝试过调整这个数字)我应该在问题中将 6e6 更改为这个数字吗?
  • @AzharMehmood 是的,1000-2000 可以在 Python 中实现。为此,您可能需要利用机器的所有内核/CPU,并且一种方法是多处理,但不能使用multiprocessing.dummy,因为它会产生线程而不是进程并最终导致 GIL 锁定和使用只有一个核心。使用纯multiprocessing,或者concurrent.futures.ProcessPoolExecutor——会更简单
  • 所以,是进程,而不是线程,OK。我也可以用 asyncio 来做吗?这会是一个明智的选择吗?如果 pypy 能提供更好的结果,我愿意使用 pypy 来超越 GIL,因为您应该使用线程进行 IO。
  • @AzharMehmood asyncio 用于进程,不完全是。首先,asyncio 在事件循环中运行任务,在线程中运行事件循环,并且从事件循环自身之外的线程访问任务不是线程安全的。但是您可以使用 asyncio 生成进程,为此您需要在主线程中运行事件循环
  • @AzharMehmood 如果你喜欢 asyncio 范式,也许你应该看看 Gevent 框架(其他常用的是 Twisted 和 Tornado)
猜你喜欢
  • 1970-01-01
  • 2020-11-02
  • 1970-01-01
  • 1970-01-01
  • 2018-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多