Explicação simples para o "padrão do reator" com seus aplicativos [fechado]

88

O padrão do reator é explicado na wikipedia e é um pouco abstrato. Você pode descrever esse padrão de uma forma mais concreta? Idealmente, com fragmentos de código ou diagramas de classe de alto nível que descrevem algumas aplicações do padrão de reator.

Eleco
fonte
3
Esta pergunta é uma ótima resposta - stackoverflow.com/questions/9138294/…
Ryan Gibbons

Respostas:

37

Você pode querer verificar o artigo original que o descreve http://www.dre.vanderbilt.edu/~schmidt/PDF/reactor-siemens.pdf

O padrão de design do Reactor lida com solicitações de serviço que são entregues simultaneamente a um aplicativo por um ou mais clientes. Cada serviço em um aplicativo pode consistir em métodos serveral e é representado por um manipulador de eventos separado que é responsável por despachar solicitações específicas do serviço. O despacho de manipuladores de eventos é executado por um dispatcher de iniciação, que gerencia os manipuladores de eventos registrados. A demultiplexação de solicitações de serviço é executada por um demultiplexador de eventos síncronos.

Reese
fonte
Como você notará ao ler o artigo, Douglas Schmidt et.al implementou uma estrutura C ++ altamente eficiente e modular chamada The Adaptive Communications Environment, onde o padrão Reactor desempenha um papel central. A estrutura em si faz uso de uma infinidade de padrões de design e vale a pena examiná-la apenas por causa disso. Se você procura uma estrutura portátil para construir back-ends C ++ altamente escalonáveis, vale a pena dar uma olhada no ACE.
user2015735
1
@reese Link foi quebrado hoje, cara :(
Allan Chua,
1
@AllanChua Acho que encontrei - dre.vanderbilt.edu/~schmidt/PDF/Reactor.pdf
sergeyrar
3
OP pediu uma explicação "simples e concreta", e você ofereceu algo que é ainda mais abstrato do que a Wikipedia ...
Zhe
22

Um reator permite que várias tarefas que bloqueiam (digamos devido a IO) sejam processadas de forma eficiente usando um único thread. O reator gerencia um pool de manipuladores e executa um loop de eventos. Quando é chamado para executar uma tarefa, ele o vincula a um manipulador novo ou vazio, tornando-o ativo. O loop de evento (1) encontra todos os manipuladores que estão ativos e desbloqueados (ou delega isso a uma implementação de despachante) (2) executa cada um desses manipuladores encontrados sequencialmente até que sejam concluídos ou cheguem a um ponto em que sejam bloqueados. Os manipuladores concluídos tornam-se inativos e vazios para reutilização, enquanto os manipuladores ativos bloqueados se rendem, permitindo que o loop de eventos continue. (3) Repete a partir da etapa (1)

andrew pate
fonte
1
Votar negativamente
3
A ideia central é realizar a demultiplexação de eventos síncronos. Os tratadores de evento só são chamados se puderem ser executados de maneira não bloqueadora, por exemplo, todo o pacote de dados está disponível em um soquete de rede, esperando que um tratador de evento processe os dados. Isso torna possível realizar o manipulador de eventos sequencialmente de maneira não bloqueadora
SebNag
2
"o padrão Reactor é responsável por demultiplexar e despachar vários manipuladores de eventos que são acionados quando é possível iniciar uma operação de forma síncrona sem bloqueio." do artigo com
link na resposta
Isto não é verdade, de forma alguma. Há tantos fios em um não reator quanto em um padrão de reator. Em vez de um loop de evento, você pode ter um único encadeamento "direcionador" que não usa o padrão observador / ouvinte de evento. Mesmo desempenho.
Zombies