2012-03-09 3 views

risposta

11

ritengo condivisibilità si riferisce al numero/tipo di soggetti che possono condividere un particolare tipo di dispatcher. Non sono sicuro della stesura delle porzioni, ma presumo che si riferisca a una sorta di partizionamento degli attori in cui si desidera solo un attore per "possedere" una discussione.

Qui ci sono le descrizioni dai commenti di codice/scaladoc per i vari tipi dispatcher. Se v'è più bisogno di chiarimenti, si prega di descrivere ciò che è chiaro:

Dispatcher:

L'evento a base di Dispatcher lega una serie di attori ad un pool di thread sostenuta da un BlockingQueue.

BalancingDispatcher:

Un evento guidato basato dispatcher esecutore che cercherà di ridistribuire il lavoro da parte degli attori impegnati al minimo gli attori. Si presume che tutti gli attori che utilizzano la stessa istanza di questo dispatcher possano elaborare tutti i messaggi che sono stati inviati a uno degli attori. Cioè gli attori appartengono a un gruppo di attori e al cliente non vi è alcuna garanzia su quale istanza attore elabori effettivamente un dato messaggio.

Sebbene la tecnica utilizzata in questa implementazione sia comunemente nota come "rubare lavoro", l'implementazione effettiva è probabilmente descritta come "donazione di lavoro" perché l'attore di cui viene rubato il lavoro prende l'iniziativa.

PinnedDispatcher:

dedica un filo unico per ciascun attore passato come riferimento. Servito attraverso il suo messaggio Queue.

CallingThreadDispatcher (in akka.testkit):

Dispatcher che gira invocazioni soltanto thread corrente. Questo dispatcher non crea nuovi thread, ma può essere utilizzato contemporaneamente da diversi thread per lo stesso attore. La strategia di invio deve essere eseguita sul thread corrente a meno che l'attore di destinazione sia sospeso o già in esecuzione sul thread corrente (se è in esecuzione su un thread diverso, questa thread bloccherà fino a quando l'altra chiamata non sarà terminata); se l'invocazione non viene eseguita, viene accodata in una coda locale del thread per essere eseguita una volta che l'invocazione attiva è terminata. Ciò porta a un ordine di esecuzione completamente deterministico se viene utilizzato un solo thread.

Sospendere e riprendere sono azioni globali per un attore, nel senso che possono influire su thread diversi, il che porta a complicazioni. Se i messaggi vengono messi in coda (thread in locale) durante il periodo di sospensione, l'unico thread per eseguirli al momento della ripresa è il thread che in realtà chiama il metodo di ripresa. Quindi, tutte le code locali del thread che non vengono attualmente scaricate (possibile, poiché suspend-queue-resume potrebbe accadere interamente durante una chiamata su un thread diverso) vengono raccolte nella coda locale thread-thread che viene quindi eseguita.È possibile sospendere un attore dal proprio stack di chiamate.

8

Dispatcher è l'implementazione predefinita.
PinnedDispatcher ha un thread per attore, quindi i thread sono bloccati ai rispettivi attori.

Per "ritiro" si intendono le restrizioni applicabili se più attori desiderano utilizzare la stessa istanza di dispatcher.

Bulkheading significa isolare sezioni l'una dall'altra - according to Wikipedia.