Spiegazione semplice per il "modello del reattore" con le sue applicazioni [chiuso]


89

Lo schema del reattore è spiegato in wikipedia ed è un po 'troppo astratto. Puoi descrivere questo modello in modo più concreto? Idealmente con frammenti di codice o diagrammi di classe di alto livello che descrivono alcune applicazioni del modello di reattore.


3
Ho trovato questa domanda un'ottima risposta - stackoverflow.com/questions/9138294/…
Ryan Gibbons

Risposte:


38

Potresti controllare il documento originale che lo descrive http://www.dre.vanderbilt.edu/~schmidt/PDF/reactor-siemens.pdf

Il modello di progettazione Reactor gestisce le richieste di servizio che vengono consegnate contemporaneamente a un'applicazione da uno o più client. Ciascun servizio in un'applicazione può essere costituito da metodi server ed è rappresentato da un gestore di eventi separato responsabile dell'invio di richieste specifiche del servizio. L'invio dei gestori di eventi viene eseguito da un dispatcher di avvio, che gestisce i gestori di eventi registrati. Il demultiplexing delle richieste di servizio viene eseguito da un demultiplexer di eventi sincrono.


Come noterai leggendo l'articolo, Douglas Schmidt et.al ha implementato un framework C ++ altamente efficiente e modulare chiamato The Adaptive Communications Environment, in cui il pattern Reactor gioca un ruolo centrale. Il framework stesso fa uso di una pletora di modelli di progettazione e vale la pena esaminarlo solo per questo. Se cerchi un framework portatile per costruire backend C ++ altamente scalabili, allora vale la pena dare un'occhiata a ACE.
user2015735

1
@reese Link è rotto oggi amico :(
Allan Chua

1
@AllanChua Penso di averlo trovato - dre.vanderbilt.edu/~schmidt/PDF/Reactor.pdf
ma

3
OP ha chiesto una spiegazione "semplice, concreta" e tu hai offerto qualcosa che è ancora più astratto di Wikipedia ...
Zhe

21

Un reattore consente di elaborare in modo efficiente più attività che si bloccano (ad esempio a causa di IO) utilizzando un singolo thread. Il reattore gestisce un pool di gestori ed esegue un ciclo di eventi. Quando viene chiamato per eseguire un task lo collega ad un gestore nuovo o vacante rendendolo attivo. Il ciclo di eventi (1) trova tutti i gestori attivi e non bloccati (o lo delega a un'implementazione del dispatcher) (2) esegue ciascuno di questi gestori trovati in sequenza finché non completano o raggiungono un punto in cui si bloccano. I gestori completati diventano inattivi e vacanti per il riutilizzo, mentre i gestori attivi bloccati cedono, consentendo al ciclo di eventi di continuare. (3) Si ripete dal passaggio (1)


1
Downvote perché questo non è corretto
SebNag

3
L'idea principale è eseguire il demultiplexing di eventi sincroni. I gestori di eventi vengono chiamati solo se possono essere eseguiti in modo non bloccante, ad esempio l'intero pacchetto di dati è disponibile su una presa di rete, in attesa che un gestore di eventi elabori i dati. Ciò consente di eseguire il gestore di eventi in modo sequenziale in modo non bloccante
SebNag

2
"il pattern Reactor è responsabile del demultiplexing e dell'invio di più gestori di eventi che vengono attivati ​​quando è possibile avviare un'operazione in modo sincrono senza blocco." dal documento collegato nella risposta accettata
SebNag

Questo non è affatto vero. Ci sono tanti fili in un non reattore quanti sono in un modello di reattore. Invece di un ciclo di eventi, puoi avere un singolo thread "guida" che non utilizza il modello osservatore / ascoltatore di eventi. Stesse prestazioni.
Zombies
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.