Los futuros son muy convenientes, pero en la práctica, es posible que necesite algunas garantías para su ejecución. Por ejemplo, considere:¿Uso práctico de futuros? Es decir, ¿cómo matarlos?
import scala.actors.Futures._
def slowFn(time:Int) = {
Thread.sleep(time * 1000)
println("%d second fn done".format(time))
}
val fs = List(future(slowFn(2)), future(slowFn(10)))
awaitAll(5000, fs:_*)
println("5 second expiration. Continuing.")
Thread.sleep(12000) // ie more calculations
println("done with everything")
La idea es iniciar algunas funciones de funcionamiento lento en paralelo. Pero no nos gustaría colgar para siempre si las funciones ejecutadas por los futuros no vuelven. Entonces usamos awaitAll() para poner un tiempo de espera en los futuros. Pero si ejecuta el código, verá que el temporizador de 5 segundos expira, pero el futuro de 10 segundos continúa ejecutándose y regresa más tarde. El tiempo de espera no mata el futuro; solo limita la espera de unirse.
Entonces, ¿cómo matar un futuro después de un período de tiempo de espera? Parece que los futuros no se pueden usar en la práctica a menos que esté seguro de que volverán en un período de tiempo conocido. De lo contrario, se corre el riesgo de perder subprocesos en el grupo de subprocesos hasta futuros no terminales hasta que no quede ninguno.
Así que las preguntas son: ¿cómo se matan los futuros? ¿Cuáles son los patrones de uso previstos para los futuros dados estos riesgos?
Pero dado que el problema de detención aún no se ha resuelto :), no tiene garantía de que una función regrese. Por lo tanto, es posible que los futuros nunca vuelvan. Entonces la pregunta original permanece ... Punto tomado sobre el awaitAll() que se usa para obtener resultados parciales. Entonces suena como un patrón de uso: pase una clase que guarda resultados parciales a medida que se generan, luego use el temporizador para sacarlos. – DrGary