我正在使用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)))
问题是,我抛出了一个print语句来显示每个请求是什么时候发出的,它一次发出了几乎21个请求,而不是我想要限制它的3个(即,一旦一个图像下载完毕,它就可以转到列表中的下一个url来获取)。我只是想知道我做错了什么。在
您的限制设置工作正常。调试时出错。在
正如mikhailgerasimov在the comment中指出的那样,您把
print()
调用放错了地方——它必须在session.get()
上下文中。在为了确信这个限制得到了遵守,我用简单的日志服务器测试了您的代码,测试显示服务器接收的连接数正好是您在
TCPConnector
中设置的连接数。测试如下:asyncio.Semaphore正好解决了这个问题。在
你的情况是这样的:
您还可能有兴趣看看这个演示信号量如何工作的现成代码example。在
相关问题 更多 >
编程相关推荐