【发布时间】:2015-07-05 15:18:58
【问题描述】:
我想在后台做一些耗时的任务。所以我需要在不同的线程中开始计算,能够检查它是否完成(可能失败)并且能够在不需要时中止计算。计算结束后应该调用同步回调函数来存储计算值。
它可以被编程为 Thread 类的一些包装器。但我想这个基本功能已经在一些 scala 库中实现了。我试图搜索但只找到对我的简单任务来说太多的 Akka。 scala.concurrent.ExecutionContext 有有用的 execute 方法,但它不返回任何对象来检查计算状态并按需中止它。
什么库包含已经描述的功能?
我检查了scala.concurrent.Future。它缺乏中止计算的能力,这是至关重要的。我使用以下策略:在后台计算一些消耗函数并提供合理的默认值。如果函数的参数发生变化,我会放弃原来的计算并开始新的计算。我无法想象如何用 Future.flatMap 重写这个策略。
【问题讨论】:
-
你应该看看期货——它们旨在提供你所描述的那种设施,尽管在惯用的使用中你不会“检查状态”——你使用
Future的单子组合器来组合计算。 Twitter's implementation 提供了现成的中断,我相信用标准库期货做类似的事情并不难。 -
我已经考虑过
Futures。scala.concurent.Future是一个特征——它不能被实例化,我也找不到它的任何具体实现。在 akka 和 scalaz 中也有Futures。我想这是许多框架和库中使用的通用名称,这使得谷歌搜索变得更加困难。而且我不需要编写计算。我正在开发很少使用并发的应用程序,因此不鼓励使用像 akka 这样的繁琐框架 -
您不会手动实例化
Future——您在伴随对象上使用Future.apply(或在某些特殊情况下使用Promise.apply)。 -
请注意,在 Java 或 Scala 中使用基于线程的 API 中止计算没有通用可靠的方法 - 您的计算要么必须支持中止本身(例如通过定期检查标志),要么您需要使用基于进程的 API(例如scala.sys.Process),因为进程可以在需要时终止。
-
docs.oracle.com/javase/7/docs/api/java/util/concurrent/… 文档说
Future.cancel(true)可能会中断执行任务的线程
标签: multithreading scala concurrency