天天看點

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).