Sobes.tech
Назад к вопросам
Middle+
6

async def check_response(delay: int, message: str) -> None: timeout = httpx.Timeout(timeout=5) client = httpx.AsyncClient( base_url=BASE_URL, timeout=timeout, ) async with client: response = await client.get(url=f"/delay/{delay}") print(response.status_code, message) async def main() -> None: await check_response(delay=2, message="from first line"), await check_response(delay=2, message="from second line"), await check_response(delay=2, message="from third line"), if __name__ == "__main__": print("Total time:", timeit.timeit(lambda: asyncio.run(main()), number=2))

Компании, где спрашивали
Литрес

Ответ от нейросети

sobes.tech AI

В представленном коде функции main вызовы check_response выполняются последовательно, так как используется await для каждого вызова по отдельности. Это значит, что следующий запрос начнётся только после завершения предыдущего, что увеличивает общее время выполнения.

Чтобы запустить все запросы параллельно и сократить время, можно использовать asyncio.gather, который запускает несколько корутин одновременно и ждёт их завершения:

async def main() -> None:
    await asyncio.gather(
        check_response(delay=2, message="from first line"),
        check_response(delay=2, message="from second line"),
        check_response(delay=2, message="from third line"),
    )

Такой подход позволит выполнять все три запроса одновременно, и общее время будет примерно равно времени самого долгого запроса (около 2 секунд), а не сумме всех.

Также обратите внимание, что в исходном коде после вызовов await стоят запятые, что не нужно и может привести к ошибкам.