Задать вопрос
Этот вопрос закрыт для ответов, так как повторяет вопрос Почему не работает семафор?
@aquario-cloud

Почему не работает семафор?

import aiohttp
import asyncio
import config

URL = f'http://xmlriver.com/search/xml?user={config.USERID}&key={config.USERKEY}&groupby=100&loc=1007989&country=2376&lr=IW&domain=65&device=desktop&query='

async def fetch(semaphore, session, query):
    await semaphore.acquire()
    async with session.get(URL + query) as r:
        print('started')
        text = await r.text()
        await asyncio.sleep(0.1)
        print('finished')
    semaphore.release()

async def main():
    limit = asyncio.BoundedSemaphore(value=2)
    async with aiohttp.ClientSession() as session:
        await asyncio.wait([fetch(limit, session, '3'), fetch(limit, session, '1'), fetch(limit, session, '4'), fetch(limit, session, '5')])

loop = asyncio.get_event_loop()
loop.run_until_complete(main())
loop.close()

По идее на выходе я должен получать
started
started
finished
finished
started
started
finished
finished

а по факту получаю
started
finished
started
finished
started
finished
started
finished

из-за чего это может быть?
  • Вопрос задан
  • 96 просмотров
Подписаться 1 Простой 2 комментария
Ответы на вопрос 1
Vindicar
@Vindicar
RTFM!
Потому что процесс обращения к серверу разбит на две части.
Одна - установка соединения, SSL-рукопожатие, формирование и отправка запроса, а также редиректы. Это - get()
Вторая - загрузка и декодирование тела ответа. Это - text().
Ты прячешь под семафор только вторую часть, но вполне возможно, что она занимает пренебрежимо мало времени по сравнению с первой. К слову, если хочешь ограничить одновременнные подключения к серверу, то точно нужно прятать под семафор первую часть тоже.
Ответ написан
Ваш ответ на вопрос

Вопрос закрыт для ответов и комментариев

Потому что уже есть похожий вопрос.
Похожие вопросы