前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >aiohttp 异步http请求-8.TCPConnector限制连接池的大小

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

作者头像
上海-悠悠
发布2022-04-26 11:06:27
1.4K0
发布2022-04-26 11:06:27
举报
文章被收录于专栏:从零开始学自动化测试

前言

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

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

TCPConnector

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

代码语言:javascript
复制
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个连接数:

代码语言:javascript
复制
    conn = aiohttp.TCPConnector(limit=30, verify_ssl=False)
    async with aiohttp.ClientSession(connector=conn) as session:

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

代码语言:javascript
复制
    conn = aiohttp.TCPConnector(limit=0)

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

代码语言:javascript
复制
    conn = aiohttp.TCPConnector(limit_per_host=30)

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

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

实例

limit=1 时连接数是1

代码语言:javascript
复制
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))

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

代码语言:javascript
复制
下载状态: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的时候

代码语言:javascript
复制
    conn = aiohttp.TCPConnector(limit=3, ssl=False)
    # 建立会话session
    async with aiohttp.ClientSession(connector=conn) as session:

运行结果:

代码语言:javascript
复制
下载状态: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).

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-04-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 从零开始学自动化测试 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • TCPConnector
  • 实例
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档