多线程 – 多线程scala中长进程的惯用超时

所以,我在stackoverflow上看到一些关于以某种方式询问如何“杀死”未来的问题,而不是弃用的Thread.stop().我看到答案解释了为什么不可能,但没有解决类似问题的替代机制.

例如:Practical use of futures? Ie, how to kill them?

我意识到未来不可能“被杀”.

我知道如何用Java方式做到这一点:将任务分解为更小的睡眠,并在一个定期检查的线程类中有一些“volatile boolean isStillRunning”.如果我通过更新此值取消了该线程,则该线程退出.这涉及“共享状态”(isStillRunning var),如果我在Scala中做同样的事情,它似乎不会非常“有用”.

在惯用功能标量中解​​决此类问题的正确方法是什么?有一个相当简洁的方法吗?我应该恢复“正常”线程和易失性标志吗?我应该以与Java关键字相同的方式使用@volatile?

最佳答案 是的,它看起来和Java一样.

对于测试装备,测试可能会挂起或运行时间太长,我会使用承诺未通过测试(出于任何原因).例如,超时监视器可以“取消”测试运行器(中断线程并比较并设置一个标志),然后完成失败的承诺.或者测试准备可能会导致配置错误的测试失败.或者,测试运行并产生结果.在更高的层次上,测试台只看到未来及其价值.

与Java不同的是你构成期货的选择.

val all = Future.traverse(tests)(test => {
  val toKeep = promise[Result]    // promise to keep, or fail by monitor
  val f = for (w <- feed(prepare(test, toKeep))) yield {
    monitored(w, toKeep) {
      listener.start(w)
      w.runTest()
    }
  }
  f completing consume _
  // strip context
  val g = f map (r => r.copy(context = null))
  (toKeep completeWith g).future
})
点赞