当我在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
{
}
}
答案 0 :(得分:3)
如果您在map
/ flatMap
/ Future
上IO
/ Task
或任何其他实现蹦床的结构,则无需使用尾递归为了堆栈安全。所以:
calltoFutureMethod(data) map {
result => sendData(newData)
}
很安全。
程序终止的事实可能是因为您使用的ExecutionContext
是a 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))