Scala 中的阻塞关键字

2023-12-30

有什么区别Future(blocking(blockingCall())) and blocking(Future(blockingCall()))?这两个都定义在scala.concurrent._

我看过在 scala 文档中 http://docs.scala-lang.org/overviews/core/futures.html#blocking和其他一些堆栈溢出答案 https://stackoverflow.com/questions/13097754/asynchronous-io-in-scala-with-futures#answer-13099594但仍不清楚有什么区别。


blocking充当提示ExecutionContext它包含阻塞代码,以便它可以生成一个新线程以防止死锁。这假设ExecutionContext可以做到这一点,但并非所有人都能做到。

让我们一一来看。


Future(blocking(blockingCall()))

这需要一个隐式的ExecutionContext执行Future。如果ExecutionContext被使用是一个BlockContext (like scala.concurrent.ExecutionContext.Implicits.global是),如果需要的话,它可能能够在其线程池中生成一个新线程来处理阻塞调用。如果不是,那么就没有什么特别的事情发生。


blocking(Future(blockingCall()))

这告诉我们Future(blockingCall())可能是阻塞调用,所以处理方式与上面相同。除了这里,Future.apply是非阻塞的,所以使用blocking实际上除了增加一点开销之外什么也没做。什么都没关系ExecutionContext我们从这里调用它,因为它无论如何都不会阻塞。However,阻塞调用within the Future会阻塞一个线程ExecutionContext它正在运行,without其阻塞的提示。因此,没有理由这样做。

我已经解释过了blocking更深入地这个答案 https://stackoverflow.com/questions/29068064/scala-concurrent-blocking-what-does-it-actually-do/29069021#29069021.


REPL 示例:

import java.util.concurrent.Executors
import scala.concurrent._
val ec = scala.concurrent.ExecutionContext.Implicits.global
val executorService = Executors.newFixedThreadPool(4)
val ec2 = ExecutionContext.fromExecutorService(executorService)

def blockingCall(i: Int): Unit = { Thread.sleep(1000); println("blocking call.. " + i) }

// Spawns enough new threads in `ec` to handle the 100 blocking calls
(0 to 100) foreach { i => Future(blocking(blockingCall(i)))(ec) }

// Does not spawn new threads, and `ec2` reaches thread starvation
// execution will be staggered as threads are freed
(0 to 100) foreach { i => Future(blocking(blockingCall(i)))(ec2) }

// `blocking` does nothing because the `Future` is executed in a different context,
// and `ec2` reaches thread starvation
(0 to 100) foreach { i => blocking(Future(blockingCall(i))(ec2)) }

// `blocking` still does nothing, but `ec` does not know to spawn new threads (even though it could)
// so we reach thread starvation again
(0 to 100) foreach { i => blocking(Future(blockingCall(i))(ec)) }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Scala 中的阻塞关键字 的相关文章

随机推荐

  • 我无法通过 VNC 查看 WPF Windows 应用程序的上下文菜单

    我可以打开上下文菜单 但无法通过 VNC 查看打开的菜单列表 我知道我可以通过直接检查vnc服务器机器来打开上下文菜单 我在不同的 vnc 服务器 客户端计算机 尽管它们都是 Windows Vista 和不同的 wpf 应用程序上进行了测
  • git,本地分支上的更改会影响其他本地分支吗?

    我有一个主分支 现在为了测试其他东西 我做了一个分支 A 我签出分支 A 修改文件 当我再次签出 master 时 更改也在那里 在其他存储库上我有正确的行为 未提交的更改将从一个分支移动到另一个分支 为了使它们分开 您必须stash在移动
  • WPF MVVM 切换用户控件

    我是 MVVM 和 WPF 的新手 但我知道 MVVM 中发生了什么 我在主窗口中的用户控件之间切换时遇到问题 在我的应用程序中我有 MainWindow xaml 包含日志和 2 个链接 显示全部和新建 当然我有 ViewModel 我还
  • 查找 NxNxN 二进制数组中仅包含 1 的最大长方体

    给定一个 NxNxN 二进制数组 仅包含 0 或 1 我们如何通过非平凡的解决方案 即 O N 3 获得最大的长方体 这是同样的问题查找 N N 二进制矩阵中仅包含零的最大矩形 https stackoverflow com questio
  • jQuery $.ajax 响应为空,但仅在 Chrome 中

    我已经用尽了所有的研究途径来解决这个问题 所以希望其他人能想到我没有想到的东西 相对直接的设置 我有一个带有一些 javascript 的 html 页面 它向 URL 在同一域中 发出 ajax 请求 后台的 java web 应用程序执
  • java.lang.NoSuchMethodError:org.springframework.beans.factory.xml.XmlReaderContext.getResourceLoader()Lorg/springframework/core/

    我正在Tomcat7 JDK1 7 Maven和其他组件上开发Spring应用程序 最近 我对应用程序进行了重大更改 需要切换到 Spring 3 更改后 我在部署到开发服务器时看到以下异常 不过 该应用程序在我的本地系统上运行完美 jav
  • Aptana 插件使 Eclipse 崩溃

    我在 Ubuntu 11 04 笔记本电脑上使用 Eclipse EE Indigo 我使用Sun JDK 当我使用帮助 安装新软件安装 aptana 插件 然后通过粘贴安装 aptana 时 http download aptana co
  • 线程安全队列有问题吗?

    我正在尝试使用 C 中的 pthreads 编写线程安全队列 我的程序在 93 的情况下都能运行 另外 7 的时间它会吐出垃圾 或者似乎睡着了 我想知道我的队列中是否存在一些缺陷 上下文切换会破坏它 thread safe queue in
  • http 收到 304 但仍然下载内容

    我请求了一个html文件 我得到了http状态代码304 我知道这意味着内容没有被修改 所以浏览器可以使用缓存 但我注意到请求计时信息中内容下载用了 2 63 秒 我用 Chrome 开发工具进行了调试 既然浏览器有缓存 为什么它仍然下载内
  • s3直接上传限制文件大小和类型

    一个新手问题 但我用谷歌搜索了一下 似乎找不到任何解决方案 我希望允许用户直接将文件上传到 S3 而不是先通过我的服务器 通过这样做 有什么方法可以在实际上传到 S3 之前检查文件的大小限制和允许的类型吗 最好不要使用 flash 而使用
  • 将 Kafka 中的 Avro 转换为 Parquet 直接转入 S3

    我的 Kafka 主题以 Avro 格式存储 我想使用整个主题 在收到时不会更改任何消息 并将其转换为 Parquet 直接保存在 S3 上 我目前正在这样做 但它需要我一次使用来自 Kafka 的消息并在本地计算机上处 理 将它们转换为
  • 删除最后一次出现数值后的所有内容

    我需要删除最后一次出现数值后的所有内容 如下所示 1234D应该1234 ABCD1234A BC应该ABCD1234 这个方法应该可以为你做到 public string StripAfterLastNumber string s int
  • Android 中用于确认码的虚线输入字段

    我正在尝试为 android 布局中的数字创建一个虚线输入字段 例如 我可以在其中添加 4 个数字并将它们放入我的主要活动中 我进行了很多搜索 但没有找到更好的解决方案 使用这个库来实现您的目标 https github com gloma
  • 无法添加应用程序 ID,因为已超出“7”天内的“10”个应用程序 ID 限制[重复]

    这个问题在这里已经有答案了 I m getting this weird error when I try to hit this button to fix this error for the app I just made I am
  • 如何使用 Spring Data REST 更新 @ManyToOne 关系?

    我将 Spring Data REST 与 JPA 结合使用 我有一个 User 实体 它与另一个在单独的 RDBMS 表中建模的名为 AccountStatus 的实体具有多对一关系 JSON 表示如下所示 id 123 username
  • ModuleNotFoundError:没有名为“django”的模块

    我已经使用 django 在虚拟环境中构建了一个站点 并按照 AWS 文档中的步骤部署该站点 我已使用 Elastic Beanstalk 将我的网站部署到 AWS Web 服务器 并设置了运行 3 6 和 django 2 1 1 的 p
  • Domino 8.5.3 64 位中 HTTPJVMMaxHeapSize 的最佳设置

    我试图找到关于 Domino 8 5 3 FP4 64 位 Windows 中 JVM 堆大小的最佳设置的明确答案 我知道默认情况下它设置为1024M 一些网站建议建议使用 1G 1024M 但这是默认设置 所以就那么好了吗 其他网站称可用
  • 在 Android VideoView 上绘制叠加层(HUD)?

    我有一个绘制的自定义视图HUD 这是我的布局
  • 约束必须是字符串(或 null)

    我找不到错误来挽救我的生命 错误是 约束必须是字符串 或空 我不知道为什么它会给我这个错误 我必须错过一些简单的东西 我尝试添加 例如 dataPane new JPanel new GridBagLayout 到我所有的面板 什么也没有
  • Scala 中的阻塞关键字

    有什么区别Future blocking blockingCall and blocking Future blockingCall 这两个都定义在scala concurrent 我看过在 scala 文档中 http docs scal