Задать вопрос
@aquario-cloud

Почему одинаковый код выдает разные ответы?

import aiohttp
import asyncio
from scripts import config

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

keywords = ['start', 'stop', 'test', 'experimental']
urls = [
    'http://xmlriver.com/search/xml?user={}&key={}&groupby=100&country=2376&lr=IW&domain=65&device=desktop&query={}'.format(
        config.USERID, config.USERKEY, keyword
    ) for keyword in keywords
]

async def boundFetch(semaphore, url):
    async with semaphore:
        async with aiohttp.ClientSession() as session:
            async with session.get(url) as response:
                print('1')
                await asyncio.sleep(0.1)
                await response.text()
                print('2')

async def main():
    limit = asyncio.BoundedSemaphore(value=config.LIMIT)
    tasks = [boundFetch(limit, url) for url in urls]
    await asyncio.wait(tasks)

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

вот собственно есть код, он выдает
1
2
1
2
1
2
1
2

а иногда
1
1
2
2
1
1
2
2

вопрос, почему одинаковый код выдает разный аутпут? это как вообще такое может происхдоить?
а еще если, в asyncio.wait поставить например 2 секунды, то все всегда работает как надо
  • Вопрос задан
  • 170 просмотров
Подписаться 2 Простой Комментировать
Решения вопроса 2
Vindicar
@Vindicar
RTFM!
Ты пытаешься выполнить сетевые запросы. Время их выполнения зависит от очень многих факторов, в т.ч. от загруженности каналов связи между тобой и сервером, от политики кэширования, и т.д. Так что смотря какой ответ придёт раньше, может получить управление та или иная корутина.
Ответ написан
sergey-gornostaev
@sergey-gornostaev Куратор тега Python
Седой и строгий
Конкурентное выполнение, в том числе асинхронное, всегда недетерменированно.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы