我们正在使用Finatra并让服务返回Twitter Future
。
目前,我们使用Future { ... }
或Future.value(..)
来构建Future
个实例,但查看源代码似乎不正确。
在Future.apply
源文档中,它说:" a
在调用线程中执行,因此必须注意阻塞代码。"
那么,如何创建一个在单独的线程上执行函数的Future
,就像Scala Future
一样?
答案 0 :(得分:2)
你需要一个FuturePool
。像val future = FuturePool.defaultPool { doStuff () }
Future.value
和Future.apply
都是即时的。它们或多或少等同于scala.concurrent.Future.successful
。
答案 1 :(得分:2)
+1迪马的答案,但是......
在后台线程(FuturePool)中执行操作因为服务器正在努力跟上请求负载通常不是正确的解决方案。假设您只是处理CPU密集型任务100ms,最好将它保持在同一个线程上并调整您拥有的服务器数量和服务请求的线程数。
但是如果您正在执行查询数据库或远程服务之类的操作,那么该调用理想情况下将返回一个真正异步的Future,它不会阻塞任何finagle线程。
如果您有一个包装网络服务的同步API,则FuturePool可能是解决它的正确方法。