我相信以下是真实的。欢迎更正和澄清:
I / O绑定任务可以占用线程并在较长时间内将其空闲。 global
线程池具有特殊规定,用于检测和处理阻塞的Future
内特别标记的代码。将监视由blocking {}
线程池支持的Future
内的ForkJoin
块中包含的代码的空闲状态,并根据需要分配额外的线程。将blocking {}
中未被Future
执行的代码包含在由适当配置的ForkJoin
线程池支持的代码中无效。 blocking
方法具有以下签名:
def blocking[T](body: ⇒ T): T
blocking
调用似乎旨在通过一个或多个BlockContext
引用来了解彼此并且是合作的,这些引用通常与普通的Scala程序员无关。
f0
未支持这些f1
时,f2
似乎与ExecutionContext
和Future
的行为相同。或者,如果此代码显示global
在范围内,f1
和f2
可能会有不同的行为,因为f1
可能会在rpc1
和{{1}时旋转更多线程因为这些表达式包含在rpc2
表达式中。 blocking
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
的执行?如何增强自定义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")
blocking
提示的自定义ExecutionContext
的最简单方法是包装blocking
并实施ForkJoinPool
方法以便它设置您自己的execute
对象,或者工作线程是BlockContext
个对象。见:github.com/scala/scala/blob/v2.11.4/src/library/scala/concurrent/BlockContext.scala。不幸的是,这并没有告诉我太多。有人能告诉我一个具体的例子吗?