Практическое использование фьючерсов? Т.е. как их убить? - PullRequest
6 голосов
/ 07 августа 2009

Фьючерсы очень удобны, но на практике вам могут потребоваться некоторые гарантии их исполнения. Например, рассмотрим:

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")

Идея состоит в том, чтобы запустить несколько медленно работающих функций параллельно. Но мы не хотим зависать вечно, если функции, выполняемые фьючерсами, не возвращаются. Поэтому мы используем awaitAll (), чтобы установить тайм-аут на фьючерсы. Но если вы запустите код, вы увидите, что 5-секундный таймер истекает, но 10-секундное будущее продолжает работать и возвращается позже. Тайм-аут не убивает будущее; это просто ограничивает время ожидания соединения.

Итак, как вы убиваете будущее после периода ожидания? Похоже, что фьючерсы не могут быть использованы на практике, если вы не уверены, что они вернутся через известное время. В противном случае вы рискуете потерять потоки в пуле потоков из не завершающихся фьючерсов, пока их не останется.

Итак, вопросы: как вы убиваете фьючерсы? Каковы предполагаемые модели использования фьючерсов с учетом этих рисков?

Ответы [ 2 ]

2 голосов
/ 07 августа 2009

Фьючерсы предназначены для использования в настройках, где вам нужно ждать завершения вычислений, несмотря ни на что. Вот почему они описаны как используемые для медленной работы функций . Вам нужен результат этой функции, но у вас есть другие вещи, которыми вы можете заниматься. На самом деле, у вас может быть много фьючерсов, не зависящих друг от друга, которые вы можете хотеть запустить параллельно, пока вы ждете, пока все не завершится.

Таймер просто обеспечивает ожидание для получения частичных результатов.

1 голос
/ 08 августа 2009

Я думаю, что причина, по которой Future не может быть просто "убита", точно такая же, как и то, почему java.lang.Thread.stop () является устаревшим .

Пока работает Future, требуется Thread. Чтобы остановить Future без вызова stop () в исполняющем потоке, необходима логика, специфичная для приложения: проверка на наличие флага, специфичного для приложения, или периодического прерывания статуса выполняющегося потока является одним из способов сделать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...