如何保证GPars线程池中任务的执行/表示顺序?

时间:2015-04-30 23:48:48

标签: multithreading groovy gpars

我正在使用Gpars线程池运行一组任务。任务执行时间变化很大,从几秒到20分钟不等。 (这些是黄瓜特征文件FWIW。)

幸运的是,INSERT INTO payments (invoice_id)列表中的最后一个任务运行时间最长,因此整个过程在那里执行runtest(' australian_government_rebate.feature')25分钟所有其他线程都已完成。

这意味着多线程无法实现其承诺。单线程测试需要65分钟才能运行,多线程测试需要48分钟。我希望30分钟或更好。

我的解决方案是按先前的执行时间对要素文件进行排序:

features

我的问题是:我可以保证这些功能会按照features = ... features.sort { a, b -> b.executionTime() <=> a.executionTime() } GParsPool.withPool(noOfCores) { features.eachParallel { feature -> runtest(feature) } } 中的顺序呈现给GParsPool吗?

2 个答案:

答案 0 :(得分:2)

对于像这样的情况,我建议使用从顺序for循环中开始的数据流任务来排序&#34;特征&#34;而不是并行集合:

PGroup group = ...
for(f in features) group.task {runtest(it)}

这可以保证您想要的启动顺序。

答案 1 :(得分:0)

保证?不,但极有可能。我认为如果你的执行时间差别那么大,你的方法实际上是很好的。