1

我想用

val c = collection.par.map{ f(_) }

这应该并行调用 f 来创建集合 c。

但是,我无法控制函数 f。

对于某些输入参数, f 存在错误并进入无限循环。

外面的一些恶人发现了这种在函数 f 中执行 bug 的数据参数。因此,他们随后将大量数据作为拒绝服务攻击提交给系统。

所以,即使我和函数 f 的作者有完美的配合,它也是一个做复杂事情的函数,可能有 bug。

如果我有一些其他线程/actor/thingy 在旁边运行,那么它如何在并行集合的创建中停止无限循环的计算?

和相关的......如果我什至不知道有一个无限循环怎么办,但我的代码只需要一个分支,它决定它根本不再需要 c,并删除对我上面的并行集合 c 的所有引用。计算会永远持续下去,还是会在对象被 GC 回收时停止?

4

2 回答 2

2

据我所知,如果map没有您自己构建一种抛出InteruptException. 即使那样,我也不知道那可能会完成什么,如果有的话。但是,如果您必须这样做...

class MyInteruptableFunction[+A,-B](f: A => B, waitCap: Long) extends (A => B){
  def apply(that: A) ={
    val timer = new Timer
    timer schedule (new MyTaskThatThowsAnException, waitCap)
    val out = f(that)
    timer cancel ()
    out
  }
}

然后这样做:

val c = collection.par.map{ new MyInterruptableFunction(f, 42) } //42 is the answer!

它丑陋,冗长且容易出错(您的任务可以完成,但仍然可以抛出错误!)因此,如果它是“我别无选择,只能这样做”,那么请这样做,但请最终解决问题。和他们的经理一起去见鬼。尽你所能让他们的生活变得艰难。我确定你有但是...

于 2013-12-19T17:34:33.773 回答
2

您如何f在单线程上下文中处理这种情况?

Java 没有提供很好的选项来处理非终止。您通常可以管理的最好方法是将非终止符包装在其自己的线程中并调用(不安全!)Thread.stop方法。到目前为止,最好的选择是首先不要有非终止fs。

于 2013-12-19T17:35:25.463 回答