Scala Future 上的等待会阻塞线程吗?

发布于 2024-10-31 16:16:39 字数 120 浏览 0 评论 0原文

当我等待 Scala Future 的结果时,它的行为是否更像接收,或者像反应,即它是否阻塞线程或调度如果有结果,是否继续?

When I wait for result of Scala Future, does it behave more like receive, or like react, i.e. does it block a thread, or schedules a continuation after result if available?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

握住我的手 2024-11-07 16:16:39

是的,在 stdlib 中它会阻塞线程,并同步等待结果。如果你想将连续传递风格应用于 future,你必须使用 Akka 或 Scalaz,它们允许直接从盒子中添加有关 future 完成的钩子。

Akka

val f1 = Future { Thread.sleep(1000); "Hello" + "World" }

val f2 = f1 map { _.length }

f2 foreach println //Done asynchronously and non-blocking

Scalaz

scala> val f1 = promise {Thread.sleep(1000); "Hello" + "World"}
f1: scalaz.concurrent.Promise[java.lang.String] = scalaz.concurrent.Promise$anon$1@1f7480

scala> val f2 = f1 map{str => str.length}
f2: scalaz.concurrent.Promise[Int] = scalaz.concurrent.Promise$anon$1@1d40442

scala> f2.map(println)
10
res5: scalaz.concurrent.Promise[Unit] = scalaz.concurrent.Promise$anon$1@116ad20

Yes, in stdlib it blocks the thread, and synchronously waits for results. If you want to apply continuation-passing style to futures, you'd have to use Akka or Scalaz that allow adding hooks on futures completion straight from the box.

Akka:

val f1 = Future { Thread.sleep(1000); "Hello" + "World" }

val f2 = f1 map { _.length }

f2 foreach println //Done asynchronously and non-blocking

Same with Scalaz:

scala> val f1 = promise {Thread.sleep(1000); "Hello" + "World"}
f1: scalaz.concurrent.Promise[java.lang.String] = scalaz.concurrent.Promise$anon$1@1f7480

scala> val f2 = f1 map{str => str.length}
f2: scalaz.concurrent.Promise[Int] = scalaz.concurrent.Promise$anon$1@1d40442

scala> f2.map(println)
10
res5: scalaz.concurrent.Promise[Unit] = scalaz.concurrent.Promise$anon$1@116ad20
对你再特殊 2024-11-07 16:16:39

它应该阻塞当前线程,但工作线程是否被阻塞,这取决于情况。

It should block current thread, but whether the worker thread is blocked, it depends.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文