什么是Scala中的非阻塞和阻塞future?

7

我正在使用Play框架,了解到Play以非阻塞方式处理每个请求。那么在Scala中,阻塞和非阻塞Future有什么区别呢?

另外,请提供有关Future和Await.Result()方法的信息。

谢谢!!!


2
一个适合初学者的期货指南(虽然已经有3年了,但仍然有效)可以在这里找到:http://danielwestheide.com/blog/2013/01/09/the-neophytes-guide-to-scala-part-8-welcome-to-the-future.html - manub
1个回答

7
如果在Future完成之前的任何时刻调用Await.Result(),则Future会变成阻塞状态。相反,如果您使用onCompleteonSuccessonFailuremapflatMap(以及其他一些方法),则注册的回调函数将在Future返回时发生。因此,Future是非阻塞的。尽可能使用带有回调的非阻塞Future

我是Scala的新手。这是否意味着Await会阻塞执行线程?我不理解语言中“Future变成了阻塞”的含义。 - Chris Prince
是的,执行线程会被阻塞,直到等待的“Future”完成。 - kliew
谢谢,这很有帮助。现在我正在尝试理解除了Await.result之外,在Future中是否有其他可以做的事情,即在Future { <MyCode> }内部,会导致(无意中)Future阻塞?例如,如果我在<MyCode>中使用Java阻塞文件读取调用,那么会导致Future阻塞吗? - Chris Prince
1
Future会在其运行的线程中阻塞,但不一定会阻塞调用线程。但是,如果有大量阻塞的Future,CPU将被占用,最终调用Future的线程将面临饥饿问题。 - kliew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接