java - 嵌套 Scala Future 是否需要托管阻塞?

标签 java scala concurrency akka future

为了让我的 fork-join-pool(默认全局)能够分配新线程,如果我嵌套了 Futures,我是否需要用阻塞 {...} 来包装所有单独的 Futures(如果它们是 DB)例如调用或其他 I/O/网络进程?

哪个是正确的?

Future.sequence(
   blocking{
      val f1 = Future(...)
      val f2 = Future(...)
      val f3 = Future(...)
      for (x <- f1; y <- f2; z <- f3) yield List(x, y, z)
   }
)

Future.sequence(
  val f1 = Future(blocking{...})
  val f2 = Future(blocking{...})
  ...
)

编辑:

我认为这个测试(打印“Futures done”,然后 8 个 hibernate 行,等待 5 秒,8 个 hibernate 行等)表明各个阻塞调用需要使用托管阻塞包装器:

val locked =
   Future.sequence {
      blocking {
         (0 to 100).map { i =>
           Future {
             val idx = i
             println(s"I'm sleeping: $i")
             Thread.sleep(5000)
             println(s"I'm awake: $i")
          }
       }
    }
 }
println("Futures done")

最佳答案

这取决于实现。 如果数据库访问或 IO 的实现是阻塞的,那么您应该将它们包装在阻塞中。

阻塞应该在每个Future内完成。因为它们会立即开始运行。

旁注:对生产代码使用全局上下文并不是一个好主意。 您应该定义针对您的用例进行优化的单独执行上下文。

对于您巧妙的用例,您可以在此处找到详细信息:http://slick.lightbend.com/doc/3.0.0/database.html#database-thread-pool

关于java - 嵌套 Scala Future 是否需要托管阻塞?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37554416/

相关文章:

download - java上的彩信协议(protocol)

java - 在java中创建Hashtable作为final

Java Catch 异常 - 空字符串

scala - 为什么在嵌套类型参数时 Scala 不能完全推断类型参数?

scala - 您将如何 "connect"许多独立图保持它们之间的背压?

c++ - `std::memory_order_acquire` 的语义是否需要 x86/x86_64 上的处理器指令?

java - 在 PCL 的 Project Tango 中可视化点云

scala - 如何使用 "Seq"字段修改此嵌套案例类?

go - slice 的并发安全映射

multithreading - 原子操作会阻塞其他线程吗?