关于this接受答案中的第三点,在任何情况下,对于正在执行的长时间运行的计算(使用CPU或IO绑定)使用blocking
都是毫无意义的或不好的,在Future
内?
最佳答案
这取决于要在其中执行ExecutionContext
的Future
。
无意义:
如果ExecutionContext
不是BlockContext
,则使用blocking
将毫无意义。也就是说,它将使用DefaultBlockContext,它仅执行代码而无需任何特殊处理。它可能不会增加那么多开销,但是毫无意义。
坏:
当线程池即将用尽时,Scala的ExecutionContext.Implicits.global
用于在ForkJoinPool
中生成新线程。也就是说,如果它知道这将通过blocking
发生。如果产生大量线程,这可能很糟糕。如果您要在很短的时间内排队进行大量工作,则global
上下文会很高兴地扩展直到出现僵局。 @ dk14的答案更深入地解释了这一点,但要点是它可以成为性能杀手,因为托管阻塞实际上会很快变得难以管理。blocking
的主要目的是避免线程池中的死锁,因此从某种意义上讲,它与性能成正比,因为达到死锁要比产生更多线程差。但是,它绝对不是神奇的性能增强器。
我已经在this answer中写了更多有关blocking
的内容。