scala.concurrent.blocking的坏用例?
发布时间:2020-12-16 09:24:48 所属栏目:安全 来源:网络整理
导读:参考 this接受的答案中的第三点,对于长期运行的计算,无论是CPU还是IO绑定,使用阻塞进行“未来”内部的任何情况都是毫无意义的. ? 解决方法 这取决于你的Future正在执行的ExecutionContext. 无意义: 如果ExecutionContext不是BlockContext,那么使用阻塞将毫
参考
this接受的答案中的第三点,对于长期运行的计算,无论是CPU还是IO绑定,使用阻塞进行“未来”内部的任何情况都是毫无意义的. ?
解决方法
这取决于你的Future正在执行的ExecutionContext.
无意义: 如果ExecutionContext不是BlockContext,那么使用阻塞将毫无意义.也就是说,它将使用DefaultBlockContext,它只是执行代码而无需任何特殊处理.它可能不会增加那么多开销,但仍然毫无意义. 坏: 当线程池即将耗尽时,Scala的ExecutionContext.Implicits.global用于在ForkJoinPool中生成新线程.也就是说,如果它知道将通过阻止发生.如果你产生了很多线程,这可能会很糟糕.如果你在很短的时间内排队做了很多工作,全球背景将会很快扩展到僵局. @ dk14的答案更深入地解释了这一点,但要点是它可以成为性能杀手,因为托管阻塞实际上可能变得很快无法管理. 阻塞的主要目的是避免线程池中的死锁,因此它与性能切线相关,因为达到死锁会比产生更多线程更糟糕.但是,它绝对不是一个神奇的性能增强器. 我在this answer特别写了关于阻塞的文章. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |