2013-12-19 16 views
1

我想用如何杀死一个阶并行采集

这应该并行调用F打造集c中计算。

但是,我不控制函数f。

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

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

所以,即使我有功能f的作者完美合作,它是一个功能做复杂的事情,可以有错误。

如果我有一些其他的线程/ actor/thingy一起运行,那么它如何能够阻止平行集合创建过程中无限循环的计算?

和相关...如果我甚至不知道有一个无限循环,但是我的代码只需要一个分支,它决定它不再需要c,并将所有对我的并行集合的引用删除c以上。计算是否会一直持续下去,或者当物体被GC回收时会停止计算?

+2

请修复损坏的窗口!不要在周围乱跑! –

+0

我应该添加这个细节:函数f是一个纯函数,没有变异,不使用线程/演员/有趣的业务。但是,有人为其他公司写作,而不是我。 –

+0

我还不够清楚。我编辑了这个问题来澄清(希望)。 –

回答

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! 

这是丑陋的,冗长,而且容易出错(你的任务可以完成,并且仍然可以抛出的错误! )因此,如果它是“我别无选择,只能这样做”,那么请尽快解决问题。与他们的经理举起地狱。尽一切可能让他们的生活变得困难。我相信你有但是...

+0

是的,大家都说从函数f的作者那得到合作,但这里是场景:函数f作者是完全合作的。但在一些邪恶的人之外,已经发现通过向系统发送一个特别结构化的数据片段,它会在函数f中执行一个错误并导致无限循环。因此,通过发送大量的拒绝服务攻击会导致系统崩溃。我想通过始终能够杀死并行活动来排除这种可能性。 –

+0

我编辑了原来的帖子,因为之前的评论真的是所有的反应的apropos。 –

+0

我打算接受这个解决方案。它很好地封装了goop,所以我的代码不会太混乱。它只使用一个Timer,而不是使用线程代码来假定par集合如何使用线程。我认为在这个问题的任何解决方案中,f(那)和计时器到期之间的竞争条件是不可避免的。 –

2

你如何处理这样的一个单线程上下文f

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

+0

好点。这个问题并不是真正关于并行处理。我刚刚在这方面遇到了问题。 –