асинхронная версия семафора не работает в Python - PullRequest
0 голосов
/ 07 декабря 2018

Я пытаюсь загрузить несколько файлов с разных URL-адресов, используя асинхронную загрузку в asyncio и aiohttp, я ограничиваю количество соединений, созданных с помощью семафора, и я назначаю значение 4, когда я выполняю вызов, начальный он выглядит какСоздается 4 соединения и происходит параллельная выборка, однако, как только значение семафора достигает 0, с тех пор загрузка происходит 1 на 1, и я не вижу увеличения семафора, насколько я понимаю, значение семафора должно увеличиться после критической секциивыполнен.вот код

async def yut(self,urls):
    import aiohttp
    loop = asyncio.get_event_loop()
    semaphore = asyncio.BoundedSemaphore(4)
    async with aiohttp.ClientSession(loop=loop) as session:
        await asyncio.wait([
            self.get_image(url,session,semaphore) for url in urls
        ])


async def get_image(self,url, session, semaphore, chunk_size=1<<15):
    from contextlib import closing

    with (await semaphore):  # limit number of concurrent downloads
        print(semaphore._value)
        filename = self.get_filename(url)

        response = await session.get(url)
        with closing(response), open(filename, 'wb') as file:
            while True:
                chunk = await response.content.read(chunk_size)
                if not chunk:
                    break
                file.write(chunk)

    return filename

Вывод значений семафора выглядит следующим образом: 3 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

Как выпустить семафор справавремя, чтобы параллельная выборка могла быть восстановлена?

...