multithreading - 是否可以让 scala Future 在同一个线程中执行映射操作,就像 Java CompletableFuture 一样?

标签 multithreading scala future

在 Java 中可以这样做:

CompletableFuture<Integer> e = new CompletableFuture<Integer>();
e = e.thenApply(x -> x * 2);
e.complete(12);

在这种情况下,thenApply 中的函数将在调用 e.complete 的线程中运行,请参阅 thenApply

在 Scala 中,我注意到 future 的所有操作函数都有一个 ExecutionContext 作为参数,所以我假设 map (与 thenApply 的作用相同)将向执行上下文发送另一个任务。

如何使用非异步方法获得与 Java CompletableFuture 相同的行为?

最佳答案

是的,原则上这是可能的。事实上,scala 的 ExecutionContext(与 java 的线程池相反)抽象了代码的运行位置,并且不会强制您将其调度到某个线程池的线程上。相反,它也可能是当前线程。这通常被称为简化的执行上下文

例如,播放框架定义了一个:https://github.com/playframework/playframework/blob/38abd1ca6d17237950c82b1483057c5c39929cb4/framework/src/play-streams/src/main/scala/play/api/libs/streams/Execution.scala#L31

但是,在实现此操作之前,您应该真正确定自己知道自己在做什么并且确实需要它。事实上,play框架已经决定不公开它,因为用它太容易搬起石头砸自己的脚:

So... given that trampoline is not widely known and won't lead to performance advantages for users, closing.

来源:https://github.com/playframework/playframework/issues/6390

类似的讨论发生在 scala-interals 邮件列表上,争论的焦点是是否向 scala 标准库添加一个。最后,保留意见是相似的:

We have hesitated in exposing it as a general thing since it can very easily wreak having for synchronous implementations.

来源:https://groups.google.com/forum/#!msg/scala-internals/QgtKugpqUlk/llVXveEuFAAJ

另请注意,如果您正在编写性能敏感/并发代码,则还有一些替代实现可能会有所帮助,例如 monix:https://monix.io/api/3.0/

关于multithreading - 是否可以让 scala Future 在同一个线程中执行映射操作,就像 Java CompletableFuture 一样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47638865/

相关文章:

.net - 多线程Random.NextDouble()

scala - Play Swagger UI url 别名

scala - 如何使用单片眼镜更新 map

scala - akka-persistence中persistenceId的唯一性

java - 在 Android 中重复执行后台线程的最佳方法?

multithreading - 了解线程化 GHC haskell 程序的子进程

C# 是否需要在 getter 和 setter 中进行锁定?

c++ - std::async 与 std::promise

java - 遍历 List<Future> 对象抛出 IndexOutOfBounds 异常

java - Akka java 永远不会关闭 ActorRef