Scala期货和线程

Scala期货和线程,scala,concurrency,Scala,Concurrency,阅读scala.concurrent.Future和scala.concurrent.impl.Future的scala源代码,似乎通过map的每个未来组合都会为执行者分派一个新任务。我假设这通常会触发当前线程的上下文切换和/或作业的线程分配 考虑到函数流需要在它们之间传递未来,以便在不阻塞(或不深入回调意大利面)的情况下对未来的结果进行操作,这种“反应”范式在实践中不是很昂贵吗,如果代码是以模块化的方式编写的,其中每个函数只做一些小的事情并传递给其他函数,那么这取决于执行上下文。所以你可以选择

阅读scala.concurrent.Future和scala.concurrent.impl.Future的scala源代码,似乎通过
map
的每个未来组合都会为执行者分派一个新任务。我假设这通常会触发当前线程的上下文切换和/或作业的线程分配


考虑到函数流需要在它们之间传递未来,以便在不阻塞(或不深入回调意大利面)的情况下对未来的结果进行操作,这种“反应”范式在实践中不是很昂贵吗,如果代码是以模块化的方式编写的,其中每个函数只做一些小的事情并传递给其他函数,那么这取决于执行上下文。所以你可以选择策略

您是执行者,也可以在调用线程中执行,将映射调用保持在同一线程上。您可以通过显式传递执行上下文或使用隐式传递来传递自己的策略


我将首先通过记录使用了哪个线程来测试默认的fork/join池的功能。Afaik的较新版本有时使用提交线程。但是,我不知道这是否用于/应用于scala将来的回调。

是的。。。但它应该是反应性的,而不一定是性能优化的。标准库在这方面采取的方法是一种设计决策,与推特的未来实现形成对比,它针对线程亲和力进行了优化,例如,请参见一些讨论。也许@TravisBrown会将其剪切/粘贴到“您的答案”框中。他的标准高得不可思议。但他的评论比之前的评论要长得多。能不能提供一个安全推导出这样一个遗嘱执行人的例子??!“记录使用了哪个线程”也可能很好,如果它很容易完成或者只是一种好奇。。。。