0
HTTP GET要求をいくつか同時に送信し、すべての応答がタイムアウトするまで待機する関数を作成しているとします。少なくとも1つの応答がステータス200
を持たないか、タイムアウトにならない場合、私の関数は失敗を返します。同時HTTP GET要求を送信する先
私はこのように、この機能tryGets
を書いています:
import java.net.URL
import scala.concurrent.duration._
import scala.concurrent.{Await, ExecutionContext, Future}
import scala.util.Try
def unsafeGet(url: URL): String = {
val in = url.openStream()
scala.io.Source.fromInputStream(in).mkString
}
def futureGet(url: URL)
(implicit ec: ExecutionContext): Future[String] = Future {
unsafeGet(url)
}
def tryGets(urls: Seq[URL], timeOut: Duration)
(implicit ec: ExecutionContext): Try[Seq[String]] = Try {
val fut = Future.sequence(urls.map(futureGet))
Await.result(fut, timeOut)
}
それは理にかなっていますか? タイムアウトの場合に将来のインスタンスがリークしませんか?
あなたは内包を調べましたか?ここでそれを使用する方法についての良い記事です:http://danielwestheide.com/blog/2013/01/09/the-neophytes-guide-to-scala-part-8-welcome-to-the-future.html –
for-comprehensionは、先物を同時に実行するのではなく順番に実行します。 – Michael
事前に宣言していない場合。 あなたはval x = Future {}を実行できます。 {result < - x} の代わりに、{result < - Future {}} –