我正在使用GPARS线程池运行一组任务。任务执行时间从几秒钟到20分钟都非常可变。(这些是Cucumber功能文件FWIW。)
幸运的是,features
列表中的最后一个任务需要最长的运行时间,因此整个过程坐在那里执行runtest('australian_government_rebate.feature')25分钟时,所有其他线程都完成了。p>这意味着多线程无法履行其承诺。单线程测试需要65分钟才能运行,多线程测试48分钟。我希望30分钟或更高。
我的解决方案是按以前的执行时间对功能文件进行排序:
features = ...
features.sort { a, b -> b.executionTime() <=> a.executionTime() }
GParsPool.withPool(noOfCores) {
features.eachParallel { feature ->
runtest(feature)
}
}
我的问题是:我可以保证以features
中出现的顺序将功能呈现给GPARSPOOL吗?
对于这样的情况,我建议使用从一个排序的"功能"集合中的循环中启动的数据流任务,而不是并行集合:
PGroup group = ...
for(f in features) group.task {runtest(it)}
这将保证您打算的启动订单。
保证?不,但极有可能。我认为实际上看到您的方法是一个很好的方法,如果您的执行时间有很大不同。