• aiohttp 异步http请求8.TCPConnector限制连接池的大小 上海


    前言

    使用TCPConnector里面的limit参数限制连接池的大小

    • limit:同时连接的最大数量, 默认是30
    • limit_per_host: 同一端点的最大连接数量。同一端点即(host, port, is_ssl)完全相同,默认是0,不限制

    TCPConnector

    当没有设置limit参数的时候,默认值是100 (limit=100),以下是TCPConnector部分源码

    class TCPConnector(BaseConnector):
        """TCP connector.
        limit - The total number of simultaneous connections.
        limit_per_host - Number of simultaneous connections to one host.
    
        """
    
        def __init__(
            self,
            ......
            limit: int = 100,
    

    如果要限制同时打开的连接数量,可以修改limit的值,如下是设置30个连接数:

        conn = aiohttp.TCPConnector(limit=30, verify_ssl=False)
        async with aiohttp.ClientSession(connector=conn) as session:
    

    如果您明确不希望有限制,请传递0。例如:

        conn = aiohttp.TCPConnector(limit=0)
    

    limit_per_host 参数限制同时打开的连接到同一端点的数量, 同一端点即(host, port, is_ssl)完全相同,默认是0,不限制。

        conn = aiohttp.TCPConnector(limit_per_host=30)
    

    该示例将并行连接的数量限制为30。

    默认值为0(对每个主机基础没有限制)。

    实例

    limit=1 时连接数是1

    import aiohttp
    import asyncio
    from pathlib import Path
    
    
    async def down_img(session, url):
        """下载图片"""
        name = url.split('/')[-1]  # 获得图片名字
        img = await session.get(url)
        print(f'下载状态:{img.status}')
        # 触发到await就切换,等待get到数据
        content = await img.read()
        # 读取内容
        with open('./down_img/'+str(name), 'wb') as f:
            # 写入至文件
            f.write(content)
            print(f'{name} 下载完成!')
        return str(url)
    
    
    async def main(URL):
        conn = aiohttp.TCPConnector(limit=1, ssl=False)
        # 建立会话session
        async with aiohttp.ClientSession(connector=conn) as session:
            # 建立所有任务
            tasks = [asyncio.create_task(down_img(session, img_url)) for img_url in URL]
            # 触发await,等待任务完成
            done, pending = await asyncio.wait(tasks)
            all_results = [done_task.result() for done_task in done]
            # 获取所有结果
            print("ALL RESULT:"+str(all_results))
    
    
    URL = [
        'https://cdn.pixabay.com/photo/2014/10/07/13/48/mountain-477832_960_720.jpg',
        'https://cdn.pixabay.com/photo/2013/07/18/10/56/railroad-163518_960_720.jpg',
        'https://cdn.pixabay.com/photo/2018/03/12/20/07/maldives-3220702_960_720.jpg',
        'https://cdn.pixabay.com/photo/2017/08/04/17/56/dolomites-2580866_960_720.jpg',
        'https://cdn.pixabay.com/photo/2016/06/20/03/15/pier-1467984_960_720.jpg',
        'https://cdn.pixabay.com/photo/2014/07/30/02/00/iceberg-404966_960_720.jpg',
        'https://cdn.pixabay.com/photo/2014/11/02/10/41/plane-513641_960_720.jpg',
        'https://cdn.pixabay.com/photo/2015/10/30/20/13/sea-1014710_960_720.jpg'
    ]
    
    fp = Path('./down_img')
    if not fp.exists():
        fp.mkdir()
    
    loop = asyncio.get_event_loop()
    loop.run_until_complete(main(URL))
    

    运行结果可以看到,会一个个去连接请求。

    下载状态:200
    mountain-477832_960_720.jpg 下载完成!
    下载状态:200
    railroad-163518_960_720.jpg 下载完成!
    下载状态:200
    maldives-3220702_960_720.jpg 下载完成!
    下载状态:200
    dolomites-2580866_960_720.jpg 下载完成!
    下载状态:200
    pier-1467984_960_720.jpg 下载完成!
    下载状态:200
    iceberg-404966_960_720.jpg 下载完成!
    下载状态:200
    plane-513641_960_720.jpg 下载完成!
    下载状态:200
    sea-1014710_960_720.jpg 下载完成!
    

    当limit设置为3的时候

        conn = aiohttp.TCPConnector(limit=3, ssl=False)
        # 建立会话session
        async with aiohttp.ClientSession(connector=conn) as session:
    

    运行结果:

    下载状态:200
    下载状态:200
    下载状态:200
    maldives-3220702_960_720.jpg 下载完成!
    railroad-163518_960_720.jpg 下载完成!
    下载状态:200
    下载状态:200
    dolomites-2580866_960_720.jpg 下载完成!
    pier-1467984_960_720.jpg 下载完成!
    下载状态:200
    下载状态:200
    plane-513641_960_720.jpg 下载完成!
    iceberg-404966_960_720.jpg 下载完成!
    下载状态:200
    sea-1014710_960_720.jpg 下载完成!
    mountain-477832_960_720.jpg 下载完成!
    

    从运行结果可以看到,首先会连接3个(连续3个下载状态:200),当这3个中有任务完成的时候,会继续发请求(最大连接数是3).

  • 相关阅读:
    51nod 1051【基础】
    HDU5971【瞎搞】
    Lightoj1018 【状压DP】
    HDU2604【矩阵快速幂】
    HDU1501【简单DP】
    HDU3555【数位DP】
    Lightoj1037【状压DP】
    51nod 1099【贪心】
    HDU5950【矩阵快速幂】
    51nod 1049【经典】
  • 原文地址:https://www.cnblogs.com/yoyoketang/p/16188478.html
Copyright © 2020-2023  润新知