Подтвердить что ты не робот

В чем разница между моделью, управляемой событиями, и моделью реактора?

Из wikipedia Reactor Pattern:

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

Он назвал несколько примеров, например. nodejs, twisted, eventmachine

Но то, что я понимаю выше, является популярной платформой, управляемой событиями, поэтому сделать их также каркасом схемы реактора?

Как различать эти два? Или они одинаковы?

4b9b3361

Ответ 1

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

Один из способов взглянуть на шаблон реактора - рассмотреть его, тесно связанный с идеей "неблокирующих" операций. Реактор отправляет уведомления, когда некоторые операции могут быть выполнены без блокировки. Например, select(2) может использоваться для реализации шаблона реактора для чтения и записи в сокеты с использованием стандартных API-интерфейсов BSD (recv(2), send(2) и т.д.). select расскажет вам, когда вы можете сразу получать байты из сокета - потому что байты присутствуют в буфере приемника ядра для этого сокета, например.

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

API-интерфейсы завершения ввода-вывода Windows (IOCP) - это один из примеров, где можно увидеть шаблон проактора. При выполнении отправки в сокете с IOCP операция отправки запускается независимо от того, есть ли какая-либо комната в буфере передачи ядра для этого сокета. Операция отправки продолжается (в другом потоке, возможно, в ядре), а вызов WSASend завершается немедленно. Когда отправка действительно завершается (что означает только то, что отправленные байты были скопированы в буфер отправки ядра для этого сокета), вызывается функция обратного вызова, предоставляемая вызову WSASend (в новом потоке в приложении).

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

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

Строго говоря, Twisted злоупотребляет термином "реактор". Скрученный реактор, который основан на select(2) (twisted.internet.selectreactor), реализуется с использованием неблокирующего ввода-вывода, который очень похож на реактор. Однако интерфейс, который он предоставляет для кода приложения, является асинхронным, что делает его более проакторным. У Twisted также есть реактор, основанный на IOCP. Этот реактор предоставляет тот же асинхронный API API и, который использует проакторные API IOCP. Этот гибридный подход, варьирующийся от платформы к платформе в своих деталях, не делает особого значения термина "реактор" или "проактор", но поскольку API, подвергнутый воздействию twisted.internet.reactor, в основном полностью асинхронный, а не неблокирующий, проактор, вероятно, будет иметь был лучшим выбором имени.

Ответ 2

Я думаю, что это разделение "неблокирующее" и "асинхронное" неверно, так как основным следствием "асинхронного" является "неблокирование". Модель реактора - это асинхронные (так неблокирующие) вызовы, но синхронная (блокирующая) обработка этих вызовов. Proactor - это асинхронные (неблокирующие) вызовы и асинхронная (неблокирующая) обработка этих вызовов.

Ответ 3

Чтобы обрабатывать TCP-соединения, существуют две конкурирующие веб-архитектуры, а именно потоковая архитектура и управляемая событиями архитектура.

Архитектура на основе потоков

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

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

Архитектура, управляемая событиями

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

Эта креативная концепция позволяет Reactor Pattern выходить из полки и хвастаться. Система, построенная на этой архитектуре, состоит из создателей событий и пользователей событий.

Схема реактора

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

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

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

Реактор

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

Обработчики

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

"Язык шаблонов программирования программ" Джима Коплиена и Дугласа Шмидта, который был опубликован еще в 1995 году, является одной из книг, в которых подробно объясняется шаблон реактора.