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


из Википедии Схема Реактора статьи:

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

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

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

How to различать между этими двумя? Или это одно и то же?

3 71

3 ответа:

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

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

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

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

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

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

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

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

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

Потоковая Архитектура

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

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

Событийно-Управляемой Архитектуры

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

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

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

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

нет необходимости в блокировке других потоков при вводе / выводе, так как пока обработчики для событий зарегистрированы, чтобы заботиться о них. Рассматривая TCP-соединение, мы можем легко ссылаться на события в этих экземплярах: connected, input-ready, output-ready, timeout и disconnected.

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

реактор

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

обработчики

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

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