Библиотека Python для параллельного программирования на Python.

Python’s Trio — это высокоуровневая асинхронно-совместимая библиотека для параллельного программирования на Python. Он разработан, чтобы быть простым в использовании и высокопроизводительным, а также предоставлять более безопасную и эффективную альтернативу встроенному модулю asyncio.

Trio построен на концепции «задач», которые представляют собой единицы работы, выполнение которых можно запланировать одновременно. Задачи реализованы в виде асинхронных генераторов, которые похожи на обычные функции-генераторы, но могут приостанавливать и возобновлять свое выполнение асинхронно. Это позволяет задачам выполнять операции ввода-вывода, такие как чтение из сетевого сокета или запись в файл, без блокировки всей программы.

Одной из ключевых особенностей Trio является поддержка отмены и тайм-аутов. Когда задача отменяется, она немедленно останавливается, и все ресурсы, которые она использовала, освобождаются. Это полезно для гарантии того, что длительные задачи могут быть остановлены корректно, если это необходимо. С другой стороны, тайм-ауты позволяют задачам указывать максимальное количество времени, в течение которого им разрешено выполняться, прежде чем они будут автоматически отменены. Это может быть полезно для предотвращения бесконечного выполнения задач или для установки верхних границ количества времени, которое разрешено выполнять задачам.

Вот простой пример того, как использовать Trio для выполнения параллельного HTTP-запроса:

import trio
import requests

async def fetch_url(url):
    async with trio.open_nursery() as nursery:
        async with requests.Session() as session:
            response = await session.get(url)
            return response.text

async def main():
    result = await fetch_url('https://www.example.com')
    print(result)

trio.run(main)

В этом примере мы используем функцию Trio open_nursery для создания «питомника», в котором мы можем выполнять параллельные задачи. Затем мы используем библиотеку requests для отправки HTTP-запроса GET на указанный URL-адрес. Функция fetch_url возвращает тело ответа в виде строки.

Еще одна полезная функция Trio — поддержка асинхронных менеджеров контекста. Это объекты, которые можно использовать с оператором async with для выполнения некоторых действий при входе или выходе из блока кода. В приведенном выше примере мы используем асинхронный диспетчер контекста для создания нового объекта Session, что позволяет нам повторно использовать одно и то же HTTP-соединение для нескольких запросов.

Trio также предоставляет ряд других полезных утилит для параллельного программирования, в том числе:

  • Lock и Semaphore объекты для синхронизации доступа к общим ресурсам
  • Queue и Channel объекты для связи между задачами
  • Event и Condition объекты для сигнализации между задачами
  • open_tcp_stream и open_unix_stream функции для создания сетевых и доменных сокетов Unix
  • spawn и spawn_system_task функции для асинхронного запуска функций блокировки

Вот пример того, как использовать объект Trio Queue для связи между задачами:

import trio

async def producer(queue):
    for i in range(10):
        await queue.put(i)
        print(f'Produced {i}')
        await trio.sleep(1)

async def consumer(queue):
    while True:
        item = await queue.get()
        print(f'Consumed {item}')

async def main():
    async with trio.open_nursery
      as main_nursery:
      queue = trio.Queue()

      await main_nursery.start(producer, queue)
      await main_nursery.start(consumer, queue)

trio.run(main)

В этом примере у нас есть две задачи: задача «производитель», которая генерирует последовательность чисел и помещает их в очередь, и задача «потребитель», которая считывает элементы из очереди и печатает их. Задача «производитель» использует функцию «сна» Trio для паузы в одну секунду между каждой итерацией, в то время как задача «потребитель» выполняется бесконечно, пока очередь не станет пустой.

Объекты `Queue` и `Channel` Trio аналогичны тем, которые можно найти в других параллельных языках программирования, таких как класс `Queue` в модуле `multiprocessing` Python. Они позволяют задачам асинхронно отправлять и получать данные, что может быть полезно для координации поведения нескольких параллельных задач.

В дополнение к функциям, описанным выше, Trio также предоставляет ряд дополнительных функций для более сложных сценариев параллельного программирования. Например, он включает поддержку порождения «задач-демонов», которые работают в фоновом режиме и не препятствуют выходу программы, а также для создания настраиваемых политик планирования задач.

В целом, библиотека Python Trio предоставляет мощный и гибкий инструментарий для параллельного программирования на Python. Его простой, асинхронно-совместимый API и поддержка отмены и тайм-аутов делают его подходящим для широкого круга параллельных задач программирования.

Дополнительные материалы на PlainEnglish.io.

Подпишитесь на нашу бесплатную еженедельную рассылку новостей. Подпишитесь на нас в Twitter, LinkedIn, YouTube и Discord.

Хотите масштабировать запуск своего программного обеспечения? Ознакомьтесь с разделом Схема.