没有等待的尾巴递归

时间:2020-04-02 08:29:55

标签: scala tail-recursion

当我在map中扭曲对calltoFutureMethod(data)方法的调用时,我遇到了这样的情况:程序在将来的调用执行之前结束。

所以我用Await.result代替了它,但是我不想使用Await,因为它阻塞了,但也不能这样做:

calltoFutureMethod(data) map{
result => sendData(newData)
}

,因为尾部递归不允许这样做。没有其他方法,没有Await和Thred.sleep并具有尾递归功能?

   @scala.annotation.tailrec
      def sendData(
      data: List[String]
      ): Unit =
    data match {
    case head::tail =>
         val result = for {
         p <- calltoFutureMethod(data)
         } yield p
         val putDataList = Await.result(result, 10.seconds)
         sendData(newData)
         }
    case Nil => ...
    }

    def callToFutureMethod(data: List[String]) =
    {
    Future
     {
     }
    }

1 个答案:

答案 0 :(得分:3)

如果您在map / flatMap / FutureIO / Task或任何其他实现蹦床的结构,则无需使用尾递归为了堆栈安全。所以:

calltoFutureMethod(data) map {
  result => sendData(newData)
}

很安全。

程序终止的事实可能是因为您使用的ExecutionContexta daemon(例如ExecutionContext.Implicits.global)-如果所有其余线程都是守护程序,则允许JVM终止,因此请等待在您的main函数中为将来的结束做出决定,或者至少在这些将来中定义/使用不是恶魔的ExecutionContext

import java.util.concurrent.Executors

import scala.concurrent.ExecutionContext

// pick up whatever Executor you need
implicit val customExecutionContext: ExecutionContext =
  ExecutionContext.fromExecutor(Executors.newFixedThreadPool(10))