Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Вместо модуля requests использовать aiohttp #99

Open
ArtemBalandin81 opened this issue Nov 11, 2024 · 1 comment
Assignees
Labels
refactoring Refactorings and optimizations

Comments

@ArtemBalandin81
Copy link
Owner

ArtemBalandin81 commented Nov 11, 2024

Why?

Сдается мне, в нашем асинхронном приложении мы используем синхронный модуль requests для проверки доступности сайта. Нужно исправить это на асинхронный aiohttp!

How Does It Work Now?

Для экспериментов с асинхронным кодом придётся отказаться от модуля requests, так как он синхронный. Вызов его методов, например requests.get, блокирует программу до тех пор, пока HTTP-сервер не ответит полностью. Воспользуемся асинхронной альтернативой — модулем aiohttp.
Модуль aiohttp предоставляет возможности асинхронного HTTP-клиента. Этот модуль позволяет отправлять запросы последовательно, но чтобы отправить новый запрос, не нужно ждать, пока придёт ответ от предыдущих запросов.

How To Do?

  • Установите модуль aiohttp (вероятно, уже установлен, сверить доступность версий): pip install aiohttp==3.8.1
  • почитать доку
  • Проверить по всему проекту где нужно заменить requests на aiohttp!.

Important

Важно сохранить идентичность прежней и новой api.

Where?

src/somewhere.py
src/somewhere/somewhere/somewhere.py

@ArtemBalandin81 ArtemBalandin81 self-assigned this Nov 11, 2024
@ArtemBalandin81 ArtemBalandin81 added the refactoring Refactorings and optimizations label Nov 11, 2024
@ArtemBalandin81
Copy link
Owner Author

import asyncio
from datetime import datetime

import aiohttp


async def task(task_id):
    async with aiohttp.ClientSession() as session:
        response = await session.get('https://python.org')
        response_html = await response.text()
        print(response_html[:15])
    print(f'Задача {task_id} выполнена.')


async def async_execute():
    tasks = [asyncio.ensure_future(task(i)) for i in range(1, 11)]
    await asyncio.wait(tasks)


if __name__ == '__main__':

    ioloop = asyncio.get_event_loop()
    print('Асинхронное выполнение кода:')
    start_time = datetime.now()

    ioloop.run_until_complete(async_execute())
    ioloop.close()

    end_time = datetime.now()
    print(f'Итоговое время выполнения: {end_time - start_time} секунд.')

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
refactoring Refactorings and optimizations
Projects
None yet
Development

No branches or pull requests

1 participant