Was ist der beste Weg, um wrap-Blockierung Versuch[T] in der Zukunft[T] in Scala?
Hier ist das problem, ich habe eine Bibliothek, die eine blockierende Methode, die return-Versuch[T]. Aber da es eine Sperrung ein, ich möchte es nicht blockierende mit Zukunft[T]. In die Zukunft blockieren, ich möchte auch, um zu berechnen, etwas, das hängt von der Herkunft blockierende Methode auf den Rückgabewert.
Aber wenn ich so etwas wie unten, dann meine nonBlocking
zurück Zukunft[Try[T]], die weniger überzeugen, da die Zukunft[T] darstellen könnte Scheitern[U] schon, würde ich eher bevorzugen, propagieren die Ausnahme von Zukunft[T] self.
def blockMethod(x: Int): Try[Int] = Try {
//Some long operation to get an Int from network or IO
throw new Exception("Network Exception") }
}
def nonBlocking(x: Int): Future[Try[Int]] = future {
blockMethod(x).map(_ * 2)
}
Hier ist, was ich versucht habe, benutze ich nur .get
Methode in future {}
block, aber ich bin mir nicht sicher, ob dies der beste Weg, das zu tun.
def blockMethod(x: Int): Try[Int] = Try {
//Some long operation to get an Int from network or IO
throw new Exception("Network Exception") }
}
def nonBlocking(x: Int): Future[Int] = future {
blockMethod(x).get * 2
}
Ist diese richtige Weise, das zu tun? Oder gibt es eine scala idiomatischer Weg, um zu konvertieren t Try[T], um die Zukunft[T]?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist ein Beispiel, das nicht zu blockieren, beachten Sie, dass Sie wahrscheinlich wollen, um mit Ihrem eigenen Ausführungskontext und nicht scala globalen Kontext:
blocking
?fromTry
Methode nützlich sein, für diese? scala-lang.org/api/current/#scala.concurrent.Future$fromTry
tatsächlich blockiert, so dass kein Glück gibt.Future(t.get)
scheint nicht, um den thread zu blockieren entweder. Es sieht aus wie eine einfachere Lösung eher dann flatMapping. Gedanken?Meiner Meinung nach: Probieren & die Zukunft der monadischen Konstruktion und idiomatischer Weise ist der monadischen Zusammensetzung (für das Verständnis):
Dass Sie brauchen, um zu definieren Monaden-transformer für die Zukunft[Versuchen[_]] (code für Ihre Bibliothek):
und Verwendung Beispiel:
blockMethod(15)
durchblockMethod(5)
Ergebnisse in einer exception beendet das Programm, und die Letzte Zeileprintln(res)
wird nicht ausgeführt.