如何正确构建 Twitter 的未来
How to properly construct a Twitter Future
我们正在使用 Finatra 并提供服务 return 和 Twitter Future
。
目前我们使用 Future { ... }
或 Future.value(..)
来构造 Future
个实例,但查看源代码这似乎不正确。
在 Future.apply
源文档中说:"that a
is executed in the calling thread and as such some care must be taken with blocking code."
那么,如何创建一个 Future
来在单独的线程上执行函数,就像 Scala Future
那样?
为此你需要 FuturePool
。类似于 val future = FuturePool.defaultPool { doStuff () }
Future.value
和 Future.apply
都是即时的。它们或多或少等同于 scala.concurrent.Future.successful
.
+1 到 Dima 的回答,但是...
因为服务器难以跟上请求负载而在后台线程 (FuturePool) 中执行操作通常不是正确的解决方案。假设您只是处理一个 CPU 100 毫秒的密集型任务,最好将其保持在同一个线程上并调整您拥有的服务器数量和服务请求的线程数量。
但是,如果您正在执行查询数据库或远程服务之类的操作,那么理想情况下,该调用将 return 一个不会阻塞任何 finagle 线程的真正异步 Future。
如果您有同步 API 包装网络服务,那么 FuturePool 可能是解决它的正确方法。
我们正在使用 Finatra 并提供服务 return 和 Twitter Future
。
目前我们使用 Future { ... }
或 Future.value(..)
来构造 Future
个实例,但查看源代码这似乎不正确。
在 Future.apply
源文档中说:"that a
is executed in the calling thread and as such some care must be taken with blocking code."
那么,如何创建一个 Future
来在单独的线程上执行函数,就像 Scala Future
那样?
为此你需要 FuturePool
。类似于 val future = FuturePool.defaultPool { doStuff () }
Future.value
和 Future.apply
都是即时的。它们或多或少等同于 scala.concurrent.Future.successful
.
+1 到 Dima 的回答,但是...
因为服务器难以跟上请求负载而在后台线程 (FuturePool) 中执行操作通常不是正确的解决方案。假设您只是处理一个 CPU 100 毫秒的密集型任务,最好将其保持在同一个线程上并调整您拥有的服务器数量和服务请求的线程数量。
但是,如果您正在执行查询数据库或远程服务之类的操作,那么理想情况下,该调用将 return 一个不会阻塞任何 finagle 线程的真正异步 Future。
如果您有同步 API 包装网络服务,那么 FuturePool 可能是解决它的正确方法。