1 неделю назад
Асинхронное программирование в Python: от простого к сложному. Часть 1 Серия постов про code review Серия постов про управление памятью в Python Начинаем серию постов про асинхронное программирование в Python. Если вы пишете на Python и еще не разобрались с асинхронностью - эта серия для вас. Разберем все базовые концепты, популярные инструменты и реальные примеры использования Давайте для начала разберемся, что такое асинхронное программирование и зачем оно нужно Представьте, что вы разрабатываете бэкенд для e-commerce сайта. В синхронном подходе при оформлении заказа вы бы: 1. Проверили товар на складе 2. Дождались ответа от склада 3. Отправили запрос в платежную систему 4. Дождались ответа по оплате 5. Отправили уведомление пользователю Но ведь можно эффективнее: - Отправили запрос на склад - Пока ждем ответ, начали проверять платежные данные - Параллельно подготовили шаблон уведомления - К моменту получения всех ответов, уже можем сразу отправить результат Вот это и есть асинхронность - возможность не простаивать в ожидании медленных операций, а в это время делать что-то полезное В Python для этого есть специальные инструменты - корутины. Выглядит это так: async def process_order(order_id: int): # Запускаем несколько задач параллельно stock_info, payment_info, notification = await asyncio.gather( check_stock(order_id), process_payment(order_id), prepare_notification(order_id) ) Ключевые слова здесь: - async - говорит что функция асинхронная - await - указывает места, где мы можем "переключиться" на другую задачу - asyncio.gather() - запускает несколько корутин параллельно Но как это работает внутри? За всем этим следит event loop (цикл событий). Он как умный менеджер проекта: - Знает все задачи, которые нужно выполнить - Следит за их состоянием - Переключается между ними в нужные моменты - Раздает процессорное время тем, кто готов его использовать Когда использовать асинхронность: - Много операций ввода/вывода - Нужно обрабатывать множество параллельных соединений - Есть длительные операции, которые часто "ждут" чего-то Когда НЕ стоит использовать: - Много CPU-интенсивных вычислений - Простые скрипты без параллельных задач - Когда код должен выполняться строго последовательно Давайте подробнее разберем, что такое операции ввода/вывода (I/O operations). Это не print() или input() - это любые операции, где программа ждет данные из внешнего источника Примеры I/O операций: - Запросы к базе данных (SELECT, INSERT, UPDATE) - HTTP запросы к внешним API - Чтение/запись файлов на диск - Получение данных из очередей (Redis, RabbitMQ) - Работа с сокетами Давайте посмотрим на простой, но реальный пример - получение данных из нескольких API: async def get_data(url): async with aiohttp.ClientSession() as session: async with session.get(url) as response: return await response.json() async def fetch_all_data(): urls = [ 'https://api1.example.com/data', 'https://api2.example.com/data', 'https://api3.example.com/data' ] # Запускаем все запросы параллельно results = await asyncio.gather( *[get_data(url) for url in urls] ) return results # Запуск asyncio.run(fetch_all_data()) В синхронном варианте мы бы ждали каждый запрос по очереди. С асинхронностью все запросы идут параллельно - пока ждем ответ от первого API, уже делаем запросы к остальным Это базовое введение в асинхронность. В следующих частях разберем: - Продвинутые инструменты синхронизации - Управление ресурсами - Работу с Task и TaskGroup - Очереди и потоки данных А пока задание для практики - попробуйте переписать любой свой код с requests на aiohttp (или httpx), видео про него есть на канале) используя асинхронный подход Поддержать и посмотреть уникальные видео на Boosty Посмотреть на Youtube
1 неделю назад
3x-ui подключение по API Python
Всем привет! Недавно у меня появилась потребность во взаимодействие с api 3x-ui, но как я посмотрел по документации, она не совсем правильно работает и порой выдает ошибки. Поэтому я решил поделиться с вами готовыми функциями взаимодействия с 3x-ui по API с помощью Python. Функции работают асинхронно. async def add_client(id_client, email_id, time, subid): headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36', 'Accept': 'application/json' } url = f"{hostname_panel}/panel/api/inbounds/addClient" payload = { "id":...