当前位置: 首页 > 知识库问答 >
问题:

包装在Akka Future中的阻塞代码也会阻塞Future支持的线程,那么在这种情况下Future有什么帮助

仲浩歌
2023-03-14

Akka/Scala Future背后的理念是,当我们发现IO调用、网络调用等阻塞代码时,我们必须将其包装在Future中,并在一段时间后异步获取结果。但是,之前阻塞主线程的阻塞代码现在阻塞了Future支持的单独线程。然后Akka/Scala Future给我们带来了什么。

val blockingCallResult: Result = block() //blocks the thread of execution.

now let's use Akka/Scala future and wrap the blocking call with Future


val future = Future[Result] {

   val blockingCallResult: Result = block() //also blocks on some thread in thread pool

   blockingCallResult

}

我们如何从利用未来中获益。

共有2个答案

解宏扬
2023-03-14

如果您的代码中有任何阻塞操作,那么将执行该操作的线程确实会被阻塞。无论它是什么执行上下文产生的。如果您希望您的流是纯粹的非阻塞并从使用期货中获得真正的好处,您的IO必须是异步的。但如上所述,期货在其他方面也很有帮助。

单于骁
2023-03-14

如果只有一个执行上下文,并且只使用执行阻塞代码的future,而且一次只使用一个,那么使用future确实没有什么好处。期货的优势在于:

    < li >并行性-在多核机器上,几个线程可以同时执行。使用带有执行上下文的期货可以避免为每个动作创建一个新线程或手动重用线程的开销,并且执行上下文可以让您控制池的大小。 < li >通过使用不同的执行上下文,分离I/O和计算线程。这允许内核在长时间运行的计算任务之前安排对I/O的交互式响应,从而减少延迟。 < li >真正的异步I/O,通过scala-redis-nb(或Netty或ReactiveMongo(?)).未来不仅仅是一个阻塞的线程,有可能使用未来(例如,通过promise)来公开一个异步API(否则可能使用回调的那种),然后您可以编写真正的异步代码,避免在I/O上阻塞任何线程,并且使用比直接使用基于回调的API好得多的API。
 类似资料:
  • 本文向大家介绍什么情况下会出现css阻塞?相关面试题,主要包含被问及什么情况下会出现css阻塞?时的应答技巧和注意事项,需要的朋友参考一下 css阻塞: 将html解析为dom tree 将css解析为cssom tree 将 domtree 与cssom tree 合并生成render tree 浏览器依照render tree开始布局 所以 css阻塞过程在于下载css资源以及解析生成csso

  • 本文向大家介绍什么情况下会出现js阻塞?相关面试题,主要包含被问及什么情况下会出现js阻塞?时的应答技巧和注意事项,需要的朋友参考一下 未在script 使用 async delay 属性且不是body的最后一个标签 ajax 使用了同步

  • 问题内容: 我应该开发一个简单的SFTP。 一切都进行得很好,直到我(在本例中)没有编写全部为止。可以请我解释一下,为什么系统挂在我身上吗? 服务器端: 客户端: 问题答案: 您的循环一直运行到流结束,但是对等方永远不会关闭套接字。该协议似乎要求打开套接字以供其他命令使用,因此您必须调整它的这一部分以包括一个长度字前缀,以便您知道要复制多少字节。 问题不是关于不写所有字节,而是关于阻塞in 。

  • 问题内容: 当用户选择在另一个线程中启动阻止进程的菜单项时,我试图在JavaFX 8应用程序中提供反馈。在我的实际应用程序中,它是文件下载,但是通过示例,我使用最少的代码创建了一个测试用例: 它的工作方式如下:当选择“开始”菜单项时,主菜单文本应立即更改为“正在运行…”,然后应附加“完成!”。经过5秒钟的模拟我的文件下载的睡眠。 实际上发生的是,即使我正在使用,在阻止过程完成 后 , 两个 文本更

  • 问题内容: 注意:这不是有关settimeout的复制文章,此处的关键答案是浏览器设计选项。 我开始研究node.js:一个测试异步的简单示例: 一件有趣的事情是,在带有curl的lind命令和浏览器中,它的行为是不同的:在Ubuntu 12.10中,我在两个控制台中使用curl localhost:8080,它们在几乎相同的10个发送中进行响应。 但是,我打开了两个浏览器,几乎同时发出了请求,但

  • 在完成Coursera课程中关于反应式编程的一些练习和视频时,我看到了一个方法的定义,该方法可以“排序”未来的