Scala Futures - 内置超时?

2023-11-22

我从官方教程参考文献中无法完全理解 futures 的一个方面。http://docs.scala-lang.org/overviews/core/futures.html

scala 中的 future 是否有某种内置的超时机制?假设下面的示例是一个 5 GB 的文本文件...“Implicits.global”的隐含范围最终会导致 onFailure 以非阻塞方式触发还是可以定义?如果没有某种默认超时,这是否意味着成功或失败都不会触发?

import scala.concurrent._
import ExecutionContext.Implicits.global

val firstOccurence: Future[Int] = future {
  val source = scala.io.Source.fromFile("myText.txt")
  source.toSeq.indexOfSlice("myKeyword")
}
firstOccurence onSuccess {
  case idx => println("The keyword first appears at position: " + idx)
}
firstOccurence onFailure {
  case t => println("Could not process file: " + t.getMessage)
}

当您使用阻塞来获取结果时,您只会遇到超时行为Future。如果你想使用非阻塞回调onComplete, onSuccess or onFailure,那么你就必须自己进行超时处理。 Akka 内置了请求/响应的超时处理(?)参与者之间的消息传递,但不确定您是否要开始使用 Akka。 FWIW,在Akka中,为了超时处理,他们组成了两个Futures一起通过Future.firstCompletedOf,一个代表实际的异步任务,一个代表超时。如果超时计时器(通过HashedWheelTimer) 首先弹出,异步回调失败。

自己动手的一个非常简单的例子可能是这样的。首先,一个用于调度超时的对象:

import org.jboss.netty.util.{HashedWheelTimer, TimerTask, Timeout}
import java.util.concurrent.TimeUnit
import scala.concurrent.duration.Duration
import scala.concurrent.Promise
import java.util.concurrent.TimeoutException

object TimeoutScheduler{
  val timer = new HashedWheelTimer(10, TimeUnit.MILLISECONDS)
  def scheduleTimeout(promise:Promise[_], after:Duration) = {
    timer.newTimeout(new TimerTask{
      def run(timeout:Timeout){              
        promise.failure(new TimeoutException("Operation timed out after " + after.toMillis + " millis"))        
      }
    }, after.toNanos, TimeUnit.NANOSECONDS)
  }
}

然后是一个接受 Future 并向其添加超时行为的函数:

import scala.concurrent.{Future, ExecutionContext, Promise}
import scala.concurrent.duration.Duration

def withTimeout[T](fut:Future[T])(implicit ec:ExecutionContext, after:Duration) = {
  val prom = Promise[T]()
  val timeout = TimeoutScheduler.scheduleTimeout(prom, after)
  val combinedFut = Future.firstCompletedOf(List(fut, prom.future))
  fut onComplete{case result => timeout.cancel()}
  combinedFut
}

请注意,HashedWheelTimer我这里使用的是来自Netty的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Scala Futures - 内置超时? 的相关文章

随机推荐

  • Winforms 数据绑定:可以使用 TypeConverter 代替 Format/Parse 事件吗?

    在 Winforms 表单中 我想在输入字段包含无效值时向用户提供视觉提示 为此 我想绑定ForeColor输入字段标签的属性 布尔值 IsPropertyValid底层模型的属性 使得标签在以下情况下变为红色 IsPropertyVali
  • 现场未显示欧元符号

    我的一个字段 latin1 swedish ci 似乎在 PHPMYADMIN 字段内显示了欧元符号 然而 当我尝试在我网站上的表单输入字段中回显它时 它在 Firefox 中显示为问号 这是 html php sql mysql quer
  • 如何将XML数据转换为data.frame?

    我正在努力学习RXML包裹 我正在尝试从 books xml 示例 xml 数据文件创建 data frame 这是我得到的 library XML books lt http www w3schools com XQuery books
  • MySQL 中的 UTF8 字符串比较

    我们在 MySQL 5 中遇到有关大小写和重音的 utf8 字符串比较问题 根据我收集的信息 MySQL 通过考虑 字符组应该被视为相等 来实现排序规则 例如 在utf8 unicode ci排序规则中 所有字母 E e 都在同一个框中 以
  • 在 Android 操作系统中将 JPEG/PNG 图像转换为 TIFF 图像格式

    我正在开发一个应用程序 其中需要 TIFF 格式的图像 但在 Android 中 您可以将位图 图像转换为仅 JPEG PNG 图像 有没有在android上将JPEG PNG文件转换为TIFF格式的好方法 Android 不支持 java
  • matplotlib 颜色条的位置和大小

    我在用着quadmesh创建一个简单的极坐标投影图 这是一个最小的脚本 它基本上产生了我想要做的事情 from future import unicode literals import numpy as np import matplot
  • .NET 有 XmlEncode / XmlDecode 吗?

    有没有方法encoding and decoding XML在 NET 中 我似乎无法找到它们 并且想知道为什么它们不存在以及可以使用什么来代替 我需要对 XML 文档进行编码并将其传递给 Web 服务上的字符串参数 然后需要在另一端对其进
  • 检查 WPF DataGrid 单元是否有错误

    我在单元格上设置了验证 它按预期工作 在文本框周围放置红色突出显示并添加带有错误的工具提示 但是 如果我尝试访问 Validation GetHasError TheGrid 其中 TheGrid 是我的 DataGrid 它始终为 fal
  • 如何防止Web服务API中的并发?

    我们有三个网络服务 a b c 其中每个服务映射到一个方法 go 在一个单独的 Java 类中 ClassA ClassB ClassC 同一时间只能运行一项服务 即 b无法运行 a在跑 然而 由于这是一个 REST API 因此无法阻止客
  • 调试区域中显示的信息过多 - Xcode 8

    我刚刚升级到 Xcode 8 在构建和运行我的项目时 大量信息被打印到调试区域 这是一个示例 016 09 14 08 37 54 394736 SmartTapp 8645 112431 子系统 com apple network 类别
  • 与 getDerivedStateFromProps 中之前的 prop 进行比较

    想象一个具有 prop name 和 state elapse 的组件 new Component name gt Hi name It s been elapse seconds elapse 当 prop 时应重置为 0 name 变化
  • Java 导入与代码性能

    我想知道我是否包含了很多import在我的java程序中 它会影响我的代码的性能 例如 程序会变慢 背后的逻辑是import在Java中与include in C 它会影响我的代码的性能 例如 程序会变慢 不 它不会影响代码的性能 二进制文
  • 测量docker容器的执行时间

    我有一个名为my image启动命令并关闭 使用命令在容器中运行图像时docker run rm my image 是否可以测量容器的执行时间 Edit 我需要在容器执行后查看这些计时信息 因此我无法使用time命令 我以某种方式希望找到
  • 如何统计java中执行的字节码数量

    我要参加麻省理工学院的战斗代码竞赛 参赛者编写程序来控制互相战斗的机器人 问题是你的机器人每次只能执行一定数量的字节码 去年是每轮 10000 个 现在 一个简单的循环 喜欢 int i 0 i lt 100 i do nothing 根据
  • 在 C++ 中,类模板的显式特化定义应该放在哪里?

    根据 温度规格 5 对于给定的模板和给定的一组模板参数 一个明确的专业化在程序中最多定义一次 根据 基本 def odr and 类模板的显式 完整 特化的定义不能放在标头中 否则包含该标头的每个翻译单元中都有一个定义 因此整个程序中将有多
  • 如何在(子)模块中使用 __init__.py 定义命名空间?

    我的问题是关于编写 Python 3 x 包和 子 模块以及正确使用 init py文件来声明命名空间 我曾经用 C 编写代码 所以我喜欢使用很多单独的文件来组织项目 例如 imo 如果一个模块包含多个类 则每个类都应该位于单独的文件中 由
  • 安装和更新 Perl 模块为“通用”(x86_64、arm64)?

    是否可以安装和更新具有通用 x86 64 arm64 架构支持的 Perl CPAN 模块 如果是 那么如何 背景 在基于arm的macOS计算机上 可以为一个指定的架构安装Perl CPAN模块 如下所示 sudo cpan i Enco
  • WebStorm 和 PHPStorm 的区别

    我正在选择一个用于 Web 开发的 IDE 我想知道 WebStorm 和 PHPStorm 之间的区别是什么 我在 JetBrains 的网站上找不到任何要点 甚至 Google 也没有多大帮助 我现在所知道的是 PHPStorm 不像
  • 内联函数中的静态变量

    我有一个在头文件中声明和定义的函数 这本身就是一个问题 当该函数未内联时 使用该标头的每个翻译单元都会获得该函数的副本 并且当它们链接在一起时会出现重复 我通过使函数内联来 修复 这个问题 但恐怕这是一个脆弱的解决方案 因为据我所知 编译器
  • Scala Futures - 内置超时?

    我从官方教程参考文献中无法完全理解 futures 的一个方面 http docs scala lang org overviews core futures html scala 中的 future 是否有某种内置的超时机制 假设下面的示