如何在 Scala 中为未来添加截止日期?

     2023-03-23     168

关键词:

【中文标题】如何在 Scala 中为未来添加截止日期?【英文标题】:How to add a deadline to a future in Scala? 【发布时间】:2021-07-06 04:39:15 【问题描述】:

假设我有一个函数fab: A => Future[B] 并希望它返回一个在截止日期之前完成的新未来。所以我正在写一个像这样的新函数deadlined

def deadlined[B](fut: => Future[B], deadline: Deadline): Future[B] = ???

现在我使用java.util.Timer,但可以使用ScheduledThreadPoolExecutor 作为suggested。最好的解决方案可能是一个包装器,用于抽象出调度实现并在测试中将其模拟为 cmets 中的suggested。

object Deadlined 

  private val timer = new java.util.Timer() // todo: replace it with a wrapper

  def apply[B](fut: => Future[B], deadline: Deadline)(implicit ec: ExecutionContext): Future[B] = 
    val promise = Promise[B]()
    val timerTask = new java.util.TimerTask 
      override def run(): Unit = promise.failure(new Exception(s"$deadline is exceeded"))
    
    timer.schedule(timerTask, deadline.timeLeft.toMillis)
    fut.transform  result =>
      timerTask.cancel()
      result match 
        case Success(b) => promise.success(b)
        case Failure(t) => promise.failure(t)
      
      result
    
    promise.future
  

这有意义吗?我还想知道如何从对我上一个问题的回复中提取出Deadlined 和Delayed 的共同部分。

【问题讨论】:

Deadline 是什么? scala-lang.org/api/current/scala/concurrent/duration/… 像您已经完成的那样创建截止日期未来。然后使用Future.firstCompletedOf 取消定时任务怎么办? 【参考方案1】:

我可能会做类似以下的事情,所以我可以为任何 Future(YMMV、Caveat Emptor 等)添加截止日期:

import scala.concurrent.Future, ExecutionContext
import scala.concurrent.duration.FiniteDuration
import java.util.Timer, TimerTask

implicit class DeadlineFuture[T](future: Future[T]) 
  def deadline(d: FiniteDuration)(implicit timer: Timer): Future[T] = 
    if (future.isCompleted) future
    else 
      val promise = Promise[T]()
      val timerTask = new TimerTask 
        override def run(): Unit = promise.tryFailure(new Exception(s"$d is exceeded"))
      
      timer.schedule(timerTask, d.toMillis)
      future.onComplete(_ => timerTask.cancel())(ExecutionContext.parasitic)
      promise.completeWith(future).future
    
  


// Usage:
Future.never.deadline(5.seconds).onComplete(println)

【讨论】:

谢谢。为什么tryFailure 而不是failure 承诺? 因为如果承诺在未来完成,那么 tmer 任务中的promise.failure(…) 将抛出一个执行。 (取消 TimerTask 和尝试设置失败的 TimerTask 之间存在竞争。 哦,我明白了。谢谢。 if (future.isCompleted) future 是优化并且没有它的功能是否正确? 确实,Michael — 在某些情况下,当已知不需要 TimerTask 时,您会希望减少调度 TimerTask 的压力。

如何在 spark scala 中为单列创建数据框

】如何在sparkscala中为单列创建数据框【英文标题】:HowtoCreateDataframeinsparkscalaforsinglecoumn【发布时间】:2017-05-1816:14:51【问题描述】:我是sparkscala的新手。我有包含10列的数据框,但我想为该数据框再添加一列,该列是日期格式... 查看详情

如何在scala中为like运算符添加switch case?

】如何在scala中为like运算符添加switchcase?【英文标题】:Howtoaddswitchcaseforlikeoperatorinscala?【发布时间】:2018-10-0421:25:42【问题描述】:我有一个包含(A,B)列的数据框,其中B列是免费测试,我将其转换为类型(NOT_FOUND、TOO_LOW_PURCHAS... 查看详情

如何在swift 3中为日期添加天数

】如何在swift3中为日期添加天数【英文标题】:Howtoadddaystoadateinswift3【发布时间】:2017-08-0814:05:16【问题描述】:我从服务中获取天数、开始日期和结束日期。我想获取开始日期和结束日期之间所有日期的列表。假设我的开始日... 查看详情

如何在 Xamarin 中为 DatePicker 添加最小日期验证检查

】如何在Xamarin中为DatePicker添加最小日期验证检查【英文标题】:HowcanIaddminimumdatevalidationcheckforDatePickerinXamarin【发布时间】:2017-12-2016:04:23【问题描述】:我有两个DatePicker(命名为fromdate和todate)和一个按钮(命名为save)。默... 查看详情

如何在 postgresql 中为日期添加加号和毫秒?

】如何在postgresql中为日期添加加号和毫秒?【英文标题】:howtoaddaplussignandmillisecondstoadateinpostgresql?【发布时间】:2021-07-2601:40:25【问题描述】:日期如2021-07-23预期的输出是这样的2021-07-2400:00:00+08注意+08?我在下面试过这样,但... 查看详情

单击按钮后,如何在 Bootstrap DateTimePicker 中为日期添加月份?

】单击按钮后,如何在BootstrapDateTimePicker中为日期添加月份?【英文标题】:HowtoaddmonthstoadateinBotostrapDateTimePickeruponclickingabutton?【发布时间】:2019-02-1808:01:10【问题描述】:我的DatePicker有一个我从数据库加载的日期。但是,单击... 查看详情

如何在 PostgreSQL 中为日期添加可变小时数?

】如何在PostgreSQL中为日期添加可变小时数?【英文标题】:HowtoaddavariablenumberofhourstoadateinPostgreSQL?【发布时间】:2013-02-1602:24:24【问题描述】:Apparently,PostgreSQL没有DATEADD,因为您可以只使用+或-运算符。我需要给一个日期加上... 查看详情

java示例代码_在Scala中为枚举添加一个方法

java示例代码_在Scala中为枚举添加一个方法 查看详情

在 Pandas 中为日期添加月份

...发布时间】:2018-03-2606:27:45【问题描述】:我试图弄清楚如何将3个月添加到Pandas数据框中的日期,同时保持日期格式,以便我可以使用它来查找范围。这是我尝试过的:#createdataframedf=pd.DataFrame([pd.Timestamp(\'20161011\'),pd.Timestamp(\'20... 查看详情

我将如何添加检查约束以确保日期不在未来

】我将如何添加检查约束以确保日期不在未来【英文标题】:HowwouldIaddacheckconstraintformakingsureadateisnotinthefuture【发布时间】:2020-02-1001:01:42【问题描述】:我找不到阻止人们在未来输入日期的语法。我有这个,但它不会工作?我... 查看详情

如何在 Google Cloud Bigtable 中设置未来的插入日期?尝试使用 TTL 计算它

】如何在GoogleCloudBigtable中设置未来的插入日期?尝试使用TTL计算它【英文标题】:HowtosetafutureinsertdateinGoogleCloudBigtable?TryingtocalculateitusingTTL【发布时间】:2018-10-0314:35:47【问题描述】:我有一个只有一个列族的表,该列的TTL为172... 查看详情

jQuery:在 Datepicker 中为选定的日期添加样式

...想更改所选日期的样式,例如将文本设为绿色。我不知道如何改变风格。有没有可能?感谢您的帮助!这是我的代码:$(".testpicker").datepicker 查看详情

如何在php中计算月份截止日期[关闭]

】如何在php中计算月份截止日期[关闭]【英文标题】:Howtocalculatemonthdeadlineinphp[closed]【发布时间】:2021-09-2914:02:19【问题描述】:我正在开发一个系统,该系统允许用户将自己持续时间的月数设置为项目的截止日期。我现在面临... 查看详情

在 Netezza 中为日期添加天数

】在Netezza中为日期添加天数【英文标题】:AddingdaystoadateinNetezza【发布时间】:2018-01-0323:20:53【问题描述】:我有一个查询从字段[DATE]BETWEEN\'10/1/2017\'AND\'10/31/2017\'中提取日期我想在标准之间的结束日期(2017年10月31日)中添加天... 查看详情

Scala - 如何在 http 请求中不使用未来

】Scala-如何在http请求中不使用未来【英文标题】:Scala-howtonotuseafutureinhttprequest【发布时间】:2015-01-1312:05:16【问题描述】:我正在关注这个使用调度库的HTTP请求的简单示例。Dispatchtutorial我想在不使用期货的情况下提出请求。... 查看详情

java示例代码_在Java中为日期添加天数

java示例代码_在Java中为日期添加天数 查看详情

在 Play 中为 Scala 实现 Hibernate

】在Play中为Scala实现Hibernate【英文标题】:ImplementingHibernateinPlayforScala【发布时间】:2017-07-2117:58:14【问题描述】:我正在尝试将Hibernate集成到PlayforScala中。我向conf/META-INF添加了一个文件hibernate.cfg.xml,但显然Play没有找到它,因... 查看详情

如何编写一个同时适用于 HSQLDB 和 MySQL 的查询以在 WHERE 子句中为日期添加天数?

】如何编写一个同时适用于HSQLDB和MySQL的查询以在WHERE子句中为日期添加天数?【英文标题】:HowdoIwriteaquerythatworksinbothHSQLDBandMySQLtoadddaystoadateintheWHEREclause?【发布时间】:2014-07-1719:51:45【问题描述】:我想在日期列中添加特定天... 查看详情