关于scala.concurrent.Blocking的问题

时间:2014-11-13 09:08:29

标签: scala

我相信以下是真实的。欢迎更正和澄清:

I / O绑定任务可以占用线程并在较长时间内将其空闲。 global线程池具有特殊规定,用于检测和处理阻塞的Future内特别标记的代码。将监视由blocking {}线程池支持的Future内的ForkJoin块中包含的代码的空闲状态,并根据需要分配额外的线程。将blocking {}中未被Future执行的代码包含在由适当配置的ForkJoin线程池支持的代码中无效。 blocking方法具有以下签名:

def blocking[T](body: ⇒ T): T

blocking调用似乎旨在通过一个或多个BlockContext引用来了解彼此并且是合作的,这些引用通常与普通的Scala程序员无关。

问题

  1. 当全局f0未支持这些f1时,f2似乎与ExecutionContextFuture的行为相同。或者,如果此代码显示global在范围内,f1f2可能会有不同的行为,因为f1可能会在rpc1和{{1}时旋转更多线程因为这些表达式包含在rpc2表达式中。
  2. blocking

    1. Scala 2.11.4实际上是否以不同的方式处理import scala.concurrent._ import scala.concurrent.ExecutionContext.Implicits.global val f0 = Future { val w = nonBlockingComputation1() val x = rpc1(param1, param2, etc) val y = nonBlockingComputation2() val z = rpc2(param3, param4, etc) doSomethingWith(w, x, y, z) } val f1 = Future { val w = nonBlockingComputation1() val x = <span class="yellow">blocking</span> { rpc1(param1, param2, etc) } val y = nonBlockingComputation2() val z = blocking { rpc2(param3, param4, etc) } doSomethingWith(w, x, y, z) } val f2 = Future { blocking { val w = nonBlockingComputation1() val x = rpc1(param1, param2, etc) val y = nonBlockingComputation2() val z = rpc2(param3, param4, etc) doSomethingWith(w, x, y, z) } } f1的执行?
    2. 这种行为是否会在未来的Scala版本中发生变化?
    3. 如何增强自定义f2线程池(例如Akka配置提供的那个),以便它还支持ForkJoin

      import scala.concurrent._
      import scala.concurrent.ExecutionContext.Implicits.global
      
      val config = """
                |akka {
                |  my-dispatcher {
                |    type = Dispatcher
                |    executor = "fork-join-executor"
                |    fork-join-executor {
                |      parallelism-min = 2
                |      parallelism-factor = 2.0
                |      parallelism-max = 10
                |    }
                |    throughput = 100
                |  }
                |}
                |""".stripMargin
      
      implicit val executionContext = system.dispatchers.lookup("my-dispatcher")
    4. Aleksandar Prokopec告诉我,制作响应blocking提示的自定义ExecutionContext的最简单方法是包装blocking并实施ForkJoinPool方法以便它设置您自己的execute对象,或者工作线程是BlockContext个对象。见:github.com/scala/scala/blob/v2.11.4/src/library/scala/concurrent/BlockContext.scala。不幸的是,这并没有告诉我太多。有人能告诉我一个具体的例子吗?

0 个答案:

没有答案