没有单独线程的同步Scala Future

时间:2013-08-01 12:12:55

标签: scala threadpool future

我正在构建一个库,作为其功能的一部分,它会发出HTTP请求。为了让它在多种环境中工作,它将被部署,我希望能够使用或不使用Futures。

一个选项是让库参数化其响应的类型,以便您可以创建类型为Future的库的实例,或类型为Id的实例,具体取决于您是否使用异步HTTP实现。 (Id可能是一个Identity monad - 足以向用户公开一致的接口)

我已经开始采用这种方法,但它已经变得复杂了。我真正想要做的是在任何地方使用Future类型,在必要时在Future中装箱同步响应。但是,据我所知,使用Futures总是需要某种线程池。这不会在例如AppEngine(必需的环境)。

有没有办法从将在当前线程上执行的值创建Future,从而不会在无法生成线程的环境中引起问题?

(作为附加要求,我需要能够将库交叉构建回Scala v2.9.1,这可能会限制scala.concurrent中可用的功能)

2 个答案:

答案 0 :(得分:3)

根据我的理解,您希望执行某些操作,然后使用Future包装结果。在这种情况下,您始终可以使用Promise

val p = Promise[Int]
p success 42
val f = p.future

因此,您现在拥有一个包含最终值future

42包装器

承诺得到了很好的解释here

答案 1 :(得分:1)

在Scalaz版本的Future trait上获取look。这是基于Trampoline机制的顶部,它将由当前线程执行,除非forkapply不会被调用+完全删除所有ExecutionContext导入=)