Ho un attore che - nella sua essenza - mantiene un elenco di oggetti. Ha tre operazioni di base, un add, update e una remove (dove a volte la rimozione viene chiamata dal metodo add, ma a parte questo) e funziona con una singola raccolta. Ovviamente, a quella backing list si accede contemporaneamente, con l'aggiunta e la rimozione di chiamate che si interlacciano tra loro costantemente.Come gestire l'accesso concorrente a una collezione Scala?
La mia prima versione ha utilizzato un ListBuffer, ma ho letto da qualche parte che non è pensato per l'accesso simultaneo. Non ho ottenuto eccezioni di accesso simultanee, ma ho notato che trovare & rimuovere oggetti da esso non sempre funziona, probabilmente a causa della concorrenza.
Ero a metà della riscrittura per utilizzare un elenco var, ma rimuovere gli elementi dall'elenco immutabile predefinito di Scala è un po 'un dolore - e dubito che sia adatto per l'accesso simultaneo.
Quindi, domanda di base: quale tipo di raccolta devo utilizzare in una situazione di accesso concorrente e come viene utilizzata?
(forse secondario: è un attore in realtà un'entità multithread, o è solo la mia concezione sbagliata e lo fa elabora i messaggi uno alla volta in un singolo thread?)
(terziario: In Scala, quale la raccolta il tipo è migliore per inserimenti e accesso casuale (cancella/aggiorna)?)
Modifica: Per i rispondenti gentili: scusa la mia risposta in ritardo, sto facendo una brutta abitudine di scaricare una domanda su SO o mailing list, quindi passare al prossimo problema, dimenticando quello originale per il momento.
Un attore elabora un messaggio alla volta. La concorrenza con gli attori deriva dall'elaborazione di messaggi asincroni, non da un attore che elabora contemporaneamente più messaggi. –
Qual è il problema aziendale che stai cercando di risolvere? –
@ViktorKlang: proverò a spiegarlo un po '. Un utente invia un oggetto modello chiamato NotificationPlan al server attraverso un servizio REST. Secondo NotificationPlan, viene generato un numero di oggetti di notifica, che a un certo punto in futuro verranno restituiti agli utenti (sotto forma di notifica push Apple). In questo caso, l'attore con l'elenco come descritto nella domanda mantiene un elenco di NotificationPlans in memoria, in modo che l'utente possa aggiornare o rimuovere il suo piano dopo averlo aggiunto inizialmente. – fwielstra