Диспетчеры на Python с Asyncio

May 08 2023
Что такое событийное программирование?
Программирование на основе событий — это парадигма программирования, в которой поток программы определяется происходящими событиями, а не последовательностью инструкций, выполняемых по порядку. В программировании на основе событий программа реагирует на события в системе или среде, а не выполняет заранее определенный набор инструкций.
Фото Хитеша Чоудхари на Unsplash

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

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

Программирование на основе событий обычно используется в графических пользовательских интерфейсах (GUI), где действия пользователя, такие как щелчки мышью или ввод с клавиатуры, обрабатываются как события, запускающие действия или обновления в программе. Он также используется в веб-разработке, где HTTP-запросы или события браузера запускают выполнение кода на стороне сервера или на стороне клиента. Архитектуры, управляемые событиями, также становятся все более распространенными в распределенных системах, где сообщения или события обмениваются данными между различными службами или компонентами.

Диспетчер

В контексте программирования на основе событий диспетчер — это объект, который получает события, а затем отправляет их соответствующим обработчикам событий. Диспетчер отвечает за управление регистрацией и отменой регистрации обработчиков событий и обеспечение доставки событий нужным обработчикам.

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

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

Создайте диспетчер на Python с помощью Asyncio

Чтобы создать диспетчер с помощью asyncio в Python, вы можете использовать asyncio.Queueкласс для создания очереди, которую можно использовать для передачи сообщений между сопрограммами. Вот пример простой реализации диспетчера. Создайте файл dispatcher.pyи вставьте следующий код:

import asyncio

async def producer(queue):
    for i in range(10):
        await asyncio.sleep(1)
        await queue.put(i)
    await queue.put(None)

async def consumer(queue):
    while True:
        item = await queue.get()
        if item is None:
            break
        print(f"Consumed: {item}")
        queue.task_done()

async def main():
    queue = asyncio.Queue()
    tasks = [
        asyncio.create_task(producer(queue)),
        asyncio.create_task(consumer(queue)),
    ]
    await asyncio.gather(*tasks)
    await queue.join()

asyncio.run(main())

В mainсопрограмме мы создаем экземпляр asyncio.Queueи передаем его как сопрограммам, producerтак и consumer. Затем мы создаем задачи для обеих сопрограмм, используя asyncio.create_task(), и передаем их asyncio.gather()для одновременного запуска. Наконец, мы призываем queue.join()дождаться завершения всех задач.

Запустите файл с расширением python3 dispatcher.py. Вы получите следующий вывод:

Код этой статьи доступен здесь, на Github:

Заключение

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

Это все для этой статьи! Не стесняйтесь оставлять отзывы или вопросы в комментариях. Если вы нашли это захватывающим чтением, хлопайте в ладоши и подписывайтесь! Ваше здоровье!