com.twitter.util.Await не вызывает исключение com.twitter.util.TimeoutException

Я ожидаю, что этот код вызовет TimeoutException, но это не так. Что я делаю не так?

import com.twitter.conversions.time._
import com.twitter.util.{Await, Future}


object Tmp {

  def main(args: Array[String]): Unit = {
    Await.result(
      Future{
        Thread.sleep(10000000)
      },
        1 second
    )
  }
}

1 ответ

Решение

Скаладок Future.apply Метод имеет примечание, в котором говорится:

a выполняется в вызывающем потоке, и поэтому необходимо соблюдать осторожность с кодом блокировки.

Поэтому в общем случае вы не должны выполнять операции блокировки с фьючерсами.

Если вы хотите сделать блокировку звонков, вы должны использовать com.twitter.util.FuturePool, Дополнительные сведения о выполнении блокирующих вызовов можно найти в разделе " Блокировка или синхронная работа " документации Twitter Util.

Итак, ваш код может выглядеть так:

import com.twitter.conversions.time._
import com.twitter.util.{Await, FuturePool}

object Tmp {
  def main(args: Array[String]): Unit = {
    Await.result(
      FuturePool.unboundedPool {
        Thread.sleep(5000)
      },
      1 second
    )
  }
}

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

Другие вопросы по тегам