gpt4 book ai didi

python - aiohttp 限制并发请求数

转载 作者:太空狗 更新时间:2023-10-30 02:25:08 28 4
gpt4 key购买 nike

我正在使用 aiohttp 下载图像,想知道是否有办法限制未完成的打开请求的数量。这是我目前拥有的代码:

async def get_images(url, session):

chunk_size = 100

# Print statement to show when a request is being made.
print(f'Making request to {url}')

async with session.get(url=url) as r:
with open('path/name.png', 'wb') as file:
while True:
chunk = await r.content.read(chunk_size)
if not chunk:
break
file.write(chunk)

# List of urls to get images from
urls = [...]

conn = aiohttp.TCPConnector(limit=3)
loop = asyncio.get_event_loop()
session = aiohttp.ClientSession(connector=conn, loop=loop)
loop.run_until_complete(asyncio.gather(*(get_images(url, session=session) for url in urls)))

问题是,当每个请求被发出时,我扔了一个打印语句告诉我,它一次发出近 21 个请求,而不是我想限制的 3 个(即,一次图像下载完成后,它可以移动到列表中的下一个 url 来获取)。我只是想知道我在这里做错了什么。

最佳答案

您的限制设置工作正常。你在调试时犯了错误。

正如 Mikhail Gerasimov 在 the comment 中指出的那样,您将 print() 调用放在错误的位置 - 它必须在 session.get() 上下文中。

为了确信限制得到遵守,我针对简单的日志记录服务器测试了您的代码 - 测试表明服务器收到的连接数与您在 TCPConnector 中设置的连接数完全相同。这是测试:

import asyncio
import aiohttp
loop = asyncio.get_event_loop()


class SilentServer(asyncio.Protocol):
def connection_made(self, transport):
# We will know when the connection is actually made:
print('SERVER |', transport.get_extra_info('peername'))


async def get_images(url, session):

chunk_size = 100

# This log doesn't guarantee that we will connect,
# session.get() will freeze if you reach TCPConnector limit
print(f'CLIENT | Making request to {url}')

async with session.get(url=url) as r:
while True:
chunk = await r.content.read(chunk_size)
if not chunk:
break

urls = [f'http://127.0.0.1:1337/{x}' for x in range(20)]

conn = aiohttp.TCPConnector(limit=3)
session = aiohttp.ClientSession(connector=conn, loop=loop)


async def test():
await loop.create_server(SilentServer, '127.0.0.1', 1337)
await asyncio.gather(*(get_images(url, session=session) for url in urls))

loop.run_until_complete(test())

关于python - aiohttp 限制并发请求数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50190480/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com