【发布时间】:2015-07-14 09:57:42
【问题描述】:
这个问题的灵感来自早期 Stackoverflow article 中关于同一主题的一些 cmets,也受到我正在编写的一些代码的启发。鉴于其中包含的示例,我有点相信这种模式是尾递归的。如果是这种情况,我如何减轻由累积期货造成的内存泄漏,这些期货的底层线程从未加入产生它们的 ForkJoinPool?
import com.ning.http.client.AsyncHttpClientConfig.Builder
import play.api.libs.iteratee.Iteratee
import play.api.libs.iteratee.Execution.Implicits.defaultExecutionContext
import play.api.libs.ws.ning.NingWSClient
import scala.util.{Success,Failure}
object Client {
val client = new NingWSClient(new Builder().build())
def print = Iteratee.foreach { chunk: Array[Byte] => println(new String(chunk)) }
def main(args: Array[String]) {
connect()
def connect(): Unit = {
val consumer = client.url("http://streaming.resource.com")
consumer.get(_ => print).onComplete {
case Success(s) => println("Success")
case Failure(f) => println("Recursive retry"); connect()
}
}
}
}
在我分享的示例中,get[A](...) 方法返回一个Future[Iteratee[Array[Byte],A]]。上述文章的作者我已经包含了“scala.concurrent Futures 不会被合并”的评论,一旦它们返回,但 Twitter 的 futures 是如何管理这个的。但是,我使用的是 PlayFramework 实现,它使用标准 Scala 2.1X 库提供的期货。
你们中是否有人有证据支持或驳回这些说法?我的代码会造成内存泄漏吗?
【问题讨论】:
标签: scala recursion concurrency playframework tail-recursion