scala - 在 Scala 中使用 Future 和 Promise 取消

标签 scala promise akka future cancellation

这是 my previous question 的后续.

假设我有一个任务,它执行一个可中断的阻塞调用。我想将它作为 Future 运行并用 failure 取消它Promise的方法.

我希望取消工作如下:

  • 如果在任务完成之前取消任务,我希望任务“立即”完成,如果它已经开始,则中断阻塞调用并且我希望 Future调用 onFailure .
  • 如果在任务完成后取消任务,我想得到一个状态,说明取消失败,因为任务已经完成。

  • 是否有意义?是否可以在 Scala 中实现?是否有此类实现的任何示例?

    最佳答案

    scala.concurrent.Future 是只读的,所以一个读者不能为其他读者搞砸。

    看起来你应该能够实现你想要的,如下所示:

    def cancellableFuture[T](fun: Future[T] => T)(implicit ex: ExecutionContext): (Future[T], () => Boolean) = {
      val p = Promise[T]()
      val f = p.future
      p tryCompleteWith Future(fun(f))
      (f, () => p.tryFailure(new CancellationException))
    }
    
    val (f, cancel) = cancellableFuture( future => {
      while(!future.isCompleted) continueCalculation // isCompleted acts as our interrupted-flag
    
      result  // when we're done, return some result
    })
    
    val wasCancelled = cancel() // cancels the Future (sets its result to be a CancellationException conditionally)
    

    关于scala - 在 Scala 中使用 Future 和 Promise 取消,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16020964/

    相关文章:

    scala - 用于无形状可扩展记录的 API

    scala - 使用查询参数测试 Play Controller

    javascript - asyncawait 不等待

    java - 通过 http 的 Akka 对象流

    Scala 将 XML 导入到 map

    scala - 如何为 Maven 站点生成聚合的 scaladoc?

    node.js - 在 Promise 处理程序中使用断言的好策略是什么

    javascript - $httpBackend.flush() 进入无限循环

    scala - 如何正确使用 Akka-TestKit TestProbe?

    scala - 为什么在2.10中不推荐使用scala actor?