澄清Scala Future永远不会完成及其对其他回调的影响

Nir*_*lya 3 scala future callback

在重新阅读scala.lan.org的页面,详细说明未来在这里,我无意中发现了以下句子:

如果某些回调从未完成(例如回调包含无限循环),则可能根本不执行其他回调.在这些情况下,潜在的阻塞回调必须使用阻塞构造(见下文).

为什么其他回调根本不会被执行?我可以为给定的Future安装一些回调.完成Future的线程可能会也可能不会执行回调.但是,因为一个回调不是在玩脚趾,其余的不应该受到惩罚,我想.

我能想到的一种可能性是ExecutionContext的配置方式.如果它配置了一个线程,那么这可能会发生,但这是一个特定的行为和一般不期望的行为.

我错过了一些明显的东西吗?

mik*_*łak 5

ExecutionContext具有最终有限数量的线程的情况下调用回调- 如果不是由特定的上下文实现,则由底层操作系统和/或硬件本身调用.

假设您的系统限制是OS_LIMIT线程.您创建OS_LIMIT + 1回调.从那些OS_LIMIT回调中,回调会立即得到一个线程 - 并且都不会终止.

你怎么能保证剩下的1个回调曾经得到一个线程?

当然,Scala库中可能会内置一些检测机制,但在一般情况下,不可能实现最佳实现:也许您希望回调运行一个月.

相反,(这似乎是Scala库的方法),可以用于处理情况提供便利,开发商,知道是有风险的.这消除了系统中的惊喜元素.

也许最重要的是- 它使开发人员能够"烤在"关于处理/任务特性所需的信息直接进入他/她的节目,而不是依赖于一些不起眼的一块语言功能(可从版本改为版).