पर डिफ़ॉल्ट डिफ़ॉल्ट मान वापस करें मुझे समानांतर में एकाधिक वायदा चलाने होंगे और प्रोग्राम को क्रैश या लटका नहीं होना चाहिए।समांतर में एकाधिक फ़्यूचर्स चलाएं, टाइमआउट
अब के लिए मैं एक-एक करके वायदा पर इंतजार करता हूं, और टाइमआउट अपवाद होने पर फ़ॉलबैक मान का उपयोग करता हूं।
val future1 = // start future1
val future2 = // start future2
val future3 = // start future3
// <- at this point all 3 futures are running
// waits for maximum of timeout1 seconds
val res1 = toFallback(future1, timeout1, Map[String, Int]())
// .. timeout2 seconds
val res2 = toFallback(future2, timeout2, List[Int]())
// ... timeout3 seconds
val res3 = toFallback(future3, timeout3, Map[String, BigInt]())
def toFallback[T](f: Future[T], to: Int, default: T) = {
Try(Await.result(f, to seconds))
.recover { case to: TimeoutException => default }
}
मैं देख सकते हैं, इस स्निपेट की अधिकतम प्रतीक्षा समय timeout1 + timeout2 + timeout3
मेरा प्रश्न है: कैसे मैं एक बार में उन वायदा के सभी पर इंतजार कर सकते हैं, तो मैं max(timeout1, timeout2, timeout3)
को प्रतीक्षा समय को कम कर सकते हैं?
संपादित करें: अंत में मैं @Jatin और @senia जवाब के संशोधन का प्रयोग किया:
private def composeWaitingFuture[T](fut: Future[T],
timeout: Int, default: T) =
future { Await.result(fut, timeout seconds) } recover {
case e: Exception => default
}
और बाद में इसे प्रयोग किया जाता है इस प्रकार है:
// starts futures immediately and waits for maximum of timeoutX seconds
val res1 = composeWaitingFuture(future1, timeout1, Map[String, Int]())
val res2 = composeWaitingFuture(future2, timeout2, List[Int]())
val res3 = composeWaitingFuture(future3, timeout3, Map[String, BigInt]())
// takes the maximum of max(timeout1, timeout2, timeout3) to complete
val combinedFuture =
for {
r1 <- res1
r2 <- res2
r3 <- res3
} yield (r1, r2, r3)
और बाद में मैं combinedFuture
का उपयोग के रूप में मैं फिट देखना ।
क्या मुझे समझ नहीं आता है, यह 'timeout1 + timeout2 + timeout3' है? यह भविष्य के लिए 'टाइमआउट 1' है, भविष्य के लिए टाइमआउट 2 और इसी तरह। प्रश्न अभी भी मेरे लिए अस्पष्ट हैं – Jatin
वह समानांतर में 3 कार्यों को चलाने के लिए चाहता है, जैसे कि टाइमआउट अधिकतम तीन कार्यों का टाइमआउट –
है, मुझे लगता है कि मैंने जो जवाब दिया है वह कुछ समय पहले जैसा है, वही है जो आप चाहते हैं और यह भी गैर-अवरुद्ध कॉलबैक का लाभ उठाता है। http://stackoverflow.com/questions/16304471/scala-futures-built-in-timeout/16305056#16305056 – cmbaxter