小编LLC*_*LLC的帖子

aiohttp.TCPConnector(带限制参数)vs asyncio.Semaphore用于限制并发连接数

我想我想通过制作一个允许你在一个下载多个资源的简单脚本来学习新的python异步等待语法,更具体地说是asyncio模块.

但是现在我被卡住了.

在研究时,我遇到了两个限制并发请求数量的选项:

  1. 将aiohttp.TCPConnector(带限制参数)传递给aiohttp.ClientSession或
  2. 使用asyncio.Semaphore.

是否有首选选项,或者如果您只想限制并发连接数,它们是否可以互换使用?性能方面(大致)是否相等?

两者似乎都有默认值100并发连接/操作.如果我只使用信号量限制为500,那么aiohttp内部会隐式地将我锁定为100个并发连接吗?

这对我来说都是非常新的和不清楚的.请随时指出我的任何误解或我的代码中的缺陷.

这是我的代码目前包含两个选项(我应该删除哪些?):

奖金问题:

  1. 如何处理(最好重试x次)出现错误的coros?
  2. coro完成后,保存返回数据(通知我的DataHandler)的最佳方法是什么?我不希望最后全部保存,因为我可以尽快开始处理结果.

小号

import asyncio
from tqdm import tqdm
import uvloop as uvloop
from aiohttp import ClientSession, TCPConnector, BasicAuth

# You can ignore this class
class DummyDataHandler(DataHandler):
    """Takes data and stores it somewhere"""

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

    def take(self, origin_url, data):
        return True

    def done(self):
        return None

class AsyncDownloader(object):
    def __init__(self, concurrent_connections=100, silent=False, data_handler=None, loop_policy=None):

        self.concurrent_connections = concurrent_connections
        self.silent = silent

        self.data_handler = data_handler or DummyDataHandler()

        self.sending_bar = …
Run Code Online (Sandbox Code Playgroud)

python async-await python-asyncio aiohttp python-3.5

16
推荐指数
1
解决办法
823
查看次数