mat*_*ter 47 concurrency scala java.util.concurrent
我花了一些时间学习Scala执行上下文,底层线程模型和并发的主题.您能解释一下scala.concurrent.blocking "调整运行时行为"和"可以提高性能或避免死锁"的方式,如scaladoc中所述?
在文档中,它被作为一种等待api的手段,它不实现Awaitable.(也许只是长时间运行的计算应该被包装?).
它究竟是做什么的?
通过消息来源不容易背叛其秘密.
Mic*_*jac 75
blocking意味着充当所ExecutionContext包含的代码阻塞并可能导致线程饥饿的提示.这将使线程池有机会产生新线程以防止饥饿.这就是"调整运行时行为"的含义.虽然它并不神奇,但并不适用于所有人ExecutionContext.
考虑这个例子:
import scala.concurrent._
val ec = scala.concurrent.ExecutionContext.Implicits.global
(0 to 100) foreach { n =>
Future {
println("starting Future: " + n)
blocking { Thread.sleep(3000) }
println("ending Future: " + n)
}(ec)
}
Run Code Online (Sandbox Code Playgroud)
这是使用默认的全局ExecutionContext.按原样运行代码,您会注意到100 Future秒都是立即执行的,但如果删除blocking,它们一次只执行几个.默认情况下ExecutionContext会通过生成新线程来阻止调用(标记为这样),因此不会因运行Futures 而过载.
现在看一下这个带有4个线程的固定池的示例:
import java.util.concurrent.Executors
val executorService = Executors.newFixedThreadPool(4)
val ec = ExecutionContext.fromExecutorService(executorService)
(0 to 100) foreach { n =>
Future {
println("starting Future: " + n)
blocking { Thread.sleep(3000) }
println("ending Future: " + n)
}(ec)
}
Run Code Online (Sandbox Code Playgroud)
这ExecutionContext不是为了处理产生新线程而构建的,所以即使我的阻塞代码被包围blocking,你也可以看到它一次只能执行最多4 Future秒.所以这就是为什么我们说它"可能会提高性能或避免死锁" - 但这并不能保证.正如我们在后者看到的那样ExecutionContext,根本不能保证.
它是如何工作的?如链接,blocking执行此代码:
BlockContext.current.blockOn(body)(scala.concurrent.AwaitPermission)
Run Code Online (Sandbox Code Playgroud)
BlockContext.currentBlockContext从当前线程中检索,在这里看到.A BlockContext通常只是混合Thread了BlockContext特征.如源中所示,它存储在a中ThreadLocal,或者如果在那里找不到,则它与当前线程的模式匹配.如果当前线程不是a BlockContext,则DefaultBlockContext使用它.
接下来,blockOn调用当前BlockContext.blockOn是一个抽象方法BlockContext,所以它的实现取决于如何ExecutionContext处理它.如果我们查看实现DefaultBlockContext(当前线程不是a时BlockContext),我们看到blockOn实际上什么也没做.因此,使用blocking非BlockContext平均值表示根本没有任何特殊操作,并且代码按原样运行,没有副作用.
线程是BlockContext什么?例如,在global上下文中,看到这里,blockOn的确相当多.深入挖掘,你可以看到它正在使用ForkJoinPool引擎盖,DefaultThreadFactory在同一个片段中定义用于产生新的线程ForkJoinPool.如果没有执行blockOn从BlockContext(线程),在ForkJoinPool不知道你封锁,并不会尝试响应产生更多的线程.
Scala Await也blocking用于实现它.
| 归档时间: |
|
| 查看次数: |
4438 次 |
| 最近记录: |