Scala Future لا يُرجع أي شيء عند تخصيص الكثير من الذاكرة
-
26-12-2019 - |
سؤال
باستخدام Scala-IDE 3.0.3 (استنادًا إلى Scala 2.10.4)، يكتمل التعليمة البرمجية التالية بشكل صحيح عن طريق عرض القيم العشرة الأولى للقيمة المحسوبة List
من المستقبل وكذلك Future completed
رسالة:
import scala.concurrent._
import scala.concurrent.duration._
import scala.util.{Failure, Success}
import ExecutionContext.Implicits.global
object FutureNonBlocking extends App {
val f1: Future[List[Int]] = future {
val t = List.range(1, 50).filter(_ % 2 == 0)
println("Done")
t
}
f1.onComplete {
case Success(value) => println(value.take(10))
case Failure(e) => println("Something bad happened")
}
Await.complete(f1, 30 seconds)
}
ومع ذلك، تغيير النطاق List.range(1, 50)
ل List.range(1, 5000)
لا يعرض أي شيء و( Failure
لا يتم تشغيله).منطقيًا، يبدو أن الأمر مرتبط بمشكلة في الذاكرة ولكني لا أفهم ما يحدث هناك.
والأمر الأكثر غرابة هو أن تشغيل هذا الرمز في REPL لا يسبب المشكلة.ما الذي أفتقده هناك؟
المحلول
اتضح أن الأمر برمته ليس مشكلة في إدارة الذاكرة Futures
ولكنه مرتبط بالطريقة التي يتعامل بها Eclipse مع إخراج وحدة التحكم للبرامج المتزامنة.
إضافة Thread.sleep(1000)
في نهاية البرنامج، اسمح لـ Eclipse بإظهار جميع مخرجات وحدة التحكم، وحل المشكلة.
شكرًا جزيلاً @jilen على تعليقك المفيد للغاية!