Периодически вызывая функцию в Scala, в то время как другая дорогая функция вычисляет - PullRequest
0 голосов
/ 21 октября 2018

У меня есть функция, которая требует много времени для вычисления

def longFunc = {Thread.sleep(30000); true}

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

def shortFunc = println("pinging server! I am alive!")

. Для этого у меня есть следующий фрагмент, и он работает, но мне интересно, есть лилучший образец для этого сценария

import scala.concurrent.{Await, Future}
import scala.concurrent.duration._
import java.util.{Timer, TimerTask}
import scala.concurrent.ExecutionContext.Implicits.global

def shortFunc = println("pinging server! I am alive!")
def longFunc = {Thread.sleep(30000); true}

val funcFuture = Future{longFunc}

val timer = new Timer()
def pinger = new TimerTask {
        def run(): Unit = shortFunc
}

timer.schedule(pinger, 0L, 5000L) // ping the server every two minutes to say you are still working
val done = Await.result(funcFuture, 1 minutes)
pinger.cancel 

1 Ответ

0 голосов
/ 21 октября 2018

На самом деле я не уверен, что это более элегантный шаблон или просто для удовольствия:

import scala.concurrent.{Await, Future}
import scala.concurrent.duration._
import scala.concurrent.ExecutionContext.Implicits.global

def waiter[T](futureToWait:Future[_], waitFunc: => T, timer: Duration) = Future {
  while (!futureToWait.isCompleted) {
    Try(Await.ready(futureToWait, timer))
    waitFunc
  }
}

def longFunc = {Thread.sleep(30000); true}
def shortFunc = println("pinging server! I am alive!")

val funcFuture = Future{longFunc}
waiter(funcFuture,shortFunc,5 second)

val done = Await.result(funcFuture, 1 minutes)

То же самое, но короче:

import scala.concurrent.{Await, Future}
import scala.concurrent.duration._
import scala.concurrent.ExecutionContext.Implicits.global

def longFunc = {Thread.sleep(30000); true}
def shortFunc = println("pinging server! I am alive!")

val funcFuture = Future{longFunc}

def ff:Future[_] = Future{
  shortFunc
  Try(Await.ready(funcFuture, 5 second)).getOrElse(ff)
}
ff

val done = Await.result(funcFuture, 1 minutes)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...