akka e futures, che dovrebbe essere utilizzato in ExecutionContext

7

Seguendo questo blog di @Tomasz Nurkiewicz possiamo vedere che sono disponibili 4 diversi approcci per scegliere ExecutionContext, quando si interagisce con gli attori di akka, affinché i futuri su scala vengano eseguiti.

import ExecutionContext.Implicits.global

//or

implicit val ec = ExecutionContext.fromExecutorService(Executors.newFixedThreadPool(50))

//or (inside actor)

import context.dispatcher

//or (explicitly)

val future = Future {
    //...
} (ec)

Solo uno è specifico di akka, il resto è agnostico al fatto che la concorrenza viene gestita da attori, altrove.

Dato che ci sono situazioni in cui la gestione della concorrenza con i futuri e degli attori è inevitabile (ad esempio, la mia domanda su SO riguardo a slick ), quale paradigma si adatterebbe meglio? Esecuzione del futuro sul dispatcher dell'attore o su una delle altre possibilità, come illustrato sopra?

BTW, rileggendo la mia domanda su SO, vedo che ho usato il Global ExecutionContext di Scala, ma i log registrano i thread che gestiscono il codice futuro come appartenente al dispatcher di default di ActorSystem ... che cosa sta succedendo ???

EDIT,

è tornato alla domanda SO di cui sopra e ricreato l'esempio. Il mondo ha più senso, come i seguenti log sono apparsi (possiamo vedere che il forkJoinPool globale predefinito viene invocato in futuro mentre il dispatcher predefinito è usato per gli attori):

[INFO] [11/04/2015 09:29:06.267] [wtf-akka.actor.default-dispatcher-3] [akka://wtf/user/$a] ['wtf1] external block pre future
[INFO] [11/04/2015 09:29:06.287] [wtf-akka.actor.default-dispatcher-3] [akka://wtf/user/$a] ['wtf1] external block post future
[INFO] [11/04/2015 09:29:06.287] [ForkJoinPool-2-worker-7] [akka://wtf/user/$a] ['wtf1] internal block pre sleep
[INFO] [11/04/2015 09:29:06.461] [wtf-akka.actor.default-dispatcher-2] [akka://wtf/user/$a] ['wtf2] external block pre future
[INFO] [11/04/2015 09:29:06.471] [wtf-akka.actor.default-dispatcher-2] [akka://wtf/user/$a] ['wtf2] external block post future
[INFO] [11/04/2015 09:29:06.472] [ForkJoinPool-2-worker-5] [akka://wtf/user/$a] ['wtf2] internal block pre sleep
    
posta Yaneeve 03.11.2015 - 08:45
fonte

1 risposta

3

Dici di considerare Slick come un esempio. Slick userà JDBC, e quindi userà l'I / O di blocco, cioè il thread non sarà disponibile per fare altro lavoro mentre attende la risposta dal database. Non si desidera utilizzare il dispatcher Akka predefinito per questo.

Potresti definire un contesto di esecuzione separato per le operazioni del tuo database e usarlo. Penso che il collegamento potrebbe esserti utile.

    
risposta data 21.12.2015 - 13:06
fonte

Leggi altre domande sui tag