Асинхронный код

О том, как писать асинхронный код в Python.

Часть категории Продвинутый Python.

Асинхронный парсер сайта, часть 3: ограничиваем количество одновременных запросов

В прошлой статье мы написали конкурентный парсер сайта, и столкнулись с ошибками перегрузки интернет-соединения.

Решить эту проблему мы можем добавлением ограничителя. Ограничитель можно добавить по-разному.

Способ 1: семафоры

Семафор — примитив синхронизации, в основе которого лежит счётчик, над которым можно производить две атомарные операции: увеличение и уменьшение значения на единицу, при …

Асинхронный парсер сайта, часть 2: добавляем конкурентность

В прошлой статье мы написали асинхронный парсер сайта. Он имеет несколько проблем, главная из которых - это, собственно, отсутствие конкурентности.

Как создаётся конкурентность?

  1. Созданием нескольких задач (asyncio.create_task), без вызова await до создания всех задач
  2. Использованием asyncio.gather с несколькими корутинами

Где использовать asyncio.gather?

Там, где хотим конкурентного выполнения задач …

Асинхронный парсер сайта, часть 1: переписываем синхронный парсер

В предыдущей статье мы написали синхронный парсер/скрапер web-сайта, попробуем ускорить его.

Одним из способов ускорения программ является переписывание с помощью асинхронных функций, чтобы подпрограммы выполнялись конкурентно.

Напишем асинхронную версию этого же парсера.

Наивная реализация асинхронного парсера

Сразу же продемонстрирую получившийся код, и расскажу отличия этой версии от синхронной версии …

Синхронный парсер интернет страниц

Прежде, чем делать попытки написать асинхронный парсер, напишем в качестве старта обычный (синхронный) парсер.

Мы будем собирать все заголовки с сайта https://www.python.org.

Начнём мы с главной страницы, а затем будем проходить по каждой внутренней ссылке на странице. С каждой из них мы будем собирать заголовок (то, что …

Синхронные и асинхронные инструкции

Все инструкции, которые не содержат await (синхронные инструкции), выполняются напрямую в event loop, блокируя выполнение программы. Это означает, что пока такая инструкция выполняется, другие задачи в event loop не могут выполняться. Однако, в этот момент могут выполняться внешние операции.

import asyncio
import time

async def task1():
    print("Task 1 starting …

async for

В асинхронном программировании Python, ключевое слово async for используется для итерации по асинхронным итераторам. Этот механизм позволяет обрабатывать данные, которые поступают асинхронно, например, при работе с сетевыми соединениями, асинхронными потоками данных или асинхронными генераторами.

В обычном (синхронном) программировании итераторы используются для последовательного перебора элементов коллекции, таких как списки или кортежи …

async with

В Python ключевое слово with используется для управления ресурсами, обеспечивая корректное открытие и закрытие файлов, сетевых соединений, блокировок и других ресурсов. Аналогичным образом, в асинхронном программировании на Python можно использовать async with для управления асинхронными ресурсами.

Определение асинхронного контекстного менеджера

Асинхронные контекстные менеджеры должны реализовывать методы __aenter__ и __aexit__. Эти …

asyncio.gather

Функция asyncio.gather используется для одновременного выполнения нескольких заданий и сбора их результатов. Она принимает несколько корутин (или задач), создаёт для каждой из них задачу, и возвращает единую задачу, которая завершится, когда все переданные ей аргументы завершатся.

Пример:

import asyncio

async def task1():
    await asyncio.sleep(1)
    return "Результат задачи …

Асинхронное программирование: старт

Модуль asyncio в Python предоставляет возможности для асинхронного программирования с использованием сопрограмм (coroutine).

Асинхронное программирование представляет собой популярную парадигму, которая позволяет одновременно выполнять множество легковесных задач с минимальными затратами памяти по сравнению с потоками.

Благодаря этим преимуществам, asyncio нашел широкое применение в таких областях, как:

  • Web-разработка
  • Python API, выполняющие сетевые …