2017-03-13 3 views
0

Ich habe nicht eine direkte Verwendung für sie jetzt aber diese Frage nur in meinem Kopf auftauchte und konnte keine gute Antwort online finden:Mehrere Prozesse warten, bis die gleiche Zukunft abzuschließen (scala)

Ich habe ein Funktion 'callExactKeyFromDB', die zurückgibt: Entweder [A, Future [A]] (A = von lokal im Speichercache, Future [A] = Abfrage der DB). Kann ich diese Zukunft an verschiedene Threads/Execution-Kontexte weitergeben und sie alle auf der 'onComplete' registrieren lassen oder ist es besser, dass jedes Mal, wenn diese Funktion aufgerufen wird, eine neue Zukunft zurückgegeben wird, eine Liste registrierter Futures erstellt und diese einmal vervollständigt wird kann.

Jetzt ist die Frage, kann ich es mit 1 Zukunft tun und sollte ich es tun?

(Stellen Sie sich vor vier Prozesse Benutzerinformationen aus dem DB anfordert und darauf warten, dass es weiter)

+1

1) Sie können "Futures", z. 'List [Future]' in 'Future [List]' aber ob du es sollte ist eine andere Geschichte. 2) Postleitzahl, um alles in den Kontext zu setzen. – sebszyller

Antwort

0

Ja, Sie können mehrere Rückrufe mit einem einzigen Future registrieren. Dies erfordert weniger Code, weniger Speicher und ist besser lesbar.

0

Ich würde von Either[A,Future[A]] loszuwerden und verwandeln es in eine Future[A] mit zu beginnen.

def getUserByKey(key:Int) : Future[User] = 
    cache.users.contains(key) match { 
    case true => Future(cache.users(key)) 
    case false => Future(User(key = 101, name = "John Doe")) // db call 
    } 

Es würde die Dinge viel einfacher, ich denke ...

Wenn cache zwischen Kontexten gemeinsam genutzt wird, einmal gespeichert wird es keine Notwendigkeit mehr Anrufe auf die Datenbank zu machen, dass bestimmte Benutzer zu bekommen.

def saveUserCache(u:User) : Future[Unit] = Future{ 
    cache.users.contains(u.key) match { 
    case true => cache.users(u.key) = u 
    case false => cache.users += (u.key -> u) 
    } 
} 

Dann kann man diese Futures Erstellen anderer Futures

def renderUser(key:Int) : Future[String] = 
    for { 
    user : User <- getUserByKey(key) 
    update : Unit <- saveUserCache(user) 
    output : String <- Future(s"${user.key}: ${user.name}") 
    } yield output 

Ist Ihre Frage beantworten mischen?

+0

Ich sehe, warum Sie die Entweder wollen, aber hier ist der Kompromiss aus: Was ist wesentlich schneller, wenn ich die next() -Funktion, eine Musterübereinstimmung (oder sogar 2 Wenns) auf einem Entweder oder zurückrufen muss eine abgeschlossene Zukunft? – ovanwijk

Verwandte Themen