关于this接受答案中的第三点,在任何情况下,对于正在执行的长时间运行的计算(使用CPU或IO绑定)使用blocking都是毫无意义的或不好的,在Future内?

最佳答案

这取决于要在其中执行ExecutionContextFuture

无意义:

如果ExecutionContext不是BlockContext,则使用blocking将毫无意义。也就是说,它将使用DefaultBlockContext,它仅执行代码而无需任何特殊处理。它可能不会增加那么多开销,但是毫无意义。

坏:

当线程池即将用尽时,Scala的ExecutionContext.Implicits.global用于在ForkJoinPool中生成新线程。也就是说,如果它知道这将通过blocking发生。如果产生大量线程,这可能很糟糕。如果您要在很短的时间内排队进行大量工作,则global上下文会很高兴地扩展直到出现僵局。 @ dk14的答案更深入地解释了这一点,但要点是它可以成为性能杀手,因为托管阻塞实际上会很快变得难以管理。



blocking的主要目的是避免线程池中的死锁,因此从某种意义上讲,它与性能成正比,因为达到死锁要比产生更多线程差。但是,它绝对不是神奇的性能增强器。

我已经在this answer中写了更多有关blocking的内容。

09-25 21:57