Domanda

Supponiamo che io sono un attore che ha un singolo campo. 99 su 100 messaggi a un attore leggere il valore, e gli aggiornamenti 100th il valore. In questo caso, vorrei processo si legge in parallelo. In altre parole, come posso ottenere le prestazioni di lettura / scrittura utilizzando serrature Attori? È questo pratico con attori Scala standard o Akka? O mi manca il punto di attori:)

Aggiornamento: la lingua confondere fisso, mi spiace

È stato utile?

Soluzione

[Disclaimer: io sono il PO di Akka]

Io suggerisco di usare di agenti, invece, la lettura può essere fatta in qualsiasi momento, ma solo una scrittura alla volta.

http://doc.akkasource.org/agents-scala

EDIT: http://doc.akka.io /docs/akka/2.1.0/scala/agents.html (provate questo link)

Altri suggerimenti

Stai molto probabilmente manca il punto di attori. Sto assumendo che si desidera un attore a cui si invia una query, e poi restituisce una risposta. C'è una discreta quantità di macchinari coinvolti nell'invio di un attore di un messaggio, di elaborazione, e l'invio di una risposta indietro. La generazione attuale del messaggio di risposta verrà creata come un compito e sottoposta ad un pool di thread. Tra la coda dei messaggi e il pool di thread ci sono più luoghi che richiedono serrature o al massimo le operazioni di CAS. Di solito il punto è che l'attore farà qualche lavoro fuori in un thread separato in base a quel messaggio.

Se si desidera solo per leggere e di dati raramente scrittura (come ad esempio incrementare un contatore, o l'accesso a un valore in una mappa) sarete molto meglio utilizzare una classe appropriata dalla java.util.concurrent.

Presumo che significa che tutti i messaggi sono immutabili e che quasi tutti i messaggi non mutano lo stato dell'attore. In questo caso, gli attori non sono probabilmente la scelta migliore del design. Gli attori consentono di gestire qualsiasi stato mutevole come se si trattasse di codice threaded singolo.

In effetti, ciascun attore deve mailbox in cui i messaggi vengono inviati e poi elaborati uno alla volta. Nel vostro scenario, questo sarebbe abbastanza dispendioso. Come suggerito, usando qualcosa da java.util.concurrent sarebbe più efficace.

Gli attori sono progettati per elaborare i messaggi in serie. Questo li rende facili da ragionare su: si ottiene un messaggio alla volta, in modo che qualsiasi variabili nella attore (fintanto che non sono mutati da nessun altro) possono essere modificate senza pensare a concorrenza. È questo il metodo più efficiente? Assolutamente no! Ma il codice un po 'inefficiente che funziona correttamente è quasi sempre meglio di codice altamente efficiente che è rotto .

Quello che chiediamo è l'esatto contrario: si vuole pensare esplicitamente di concorrenza al fine di ottenere velocità di elaborazione ( "Io so che il 99% degli accessi sarà legge e quindi può avvenire in parallelo!"). In questo caso, probabilmente si desidera utilizzare per java.util.concurrent.locks.ReentrantReadWriteLock direttamente controllare l'accesso a una variabile mutabile (se il tipo di accesso trovato in java.util.concurrent.atomic._ non funziona per voi). Basta ricordare che ora avete assunto l'onere di ottenere il blocco di destra e essere adeguatamente attento.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top