我正在使用 Gpars 线程池运行一组任务。任务执行时间变化很大,从几秒到 20 分钟不等。 (这些是 cucumber 功能文件 FWIW。)
幸运的是,features
列表中的最后一个任务运行时间最长,因此整个进程会执行 runtest('australian_government_rebate.feature') 25 分钟,此时所有其他线程已完成。
这意味着多线程没有兑现其 promise 。单线程测试需要 65 分钟运行,多线程测试需要 48 分钟。我希望能持续 30 分钟或更长时间。
我的解决方案是按之前的执行时间对功能文件进行排序:
features = ...
features.sort { a, b -> b.executionTime() <=> a.executionTime() }
GParsPool.withPool(noOfCores) {
features.eachParallel { feature ->
runtest(feature)
}
}
我的问题是这样的:我能否保证这些功能将按照它们在 features
中出现的顺序呈现给 GParsPool?
最佳答案
对于像这样的情况,我建议使用从“功能”的排序集合上的顺序 for 循环开始的数据流任务,而不是并行集合:
PGroup group = ...
for(f in features) group.task {runtest(it)}
这将保证您想要的启动顺序。
关于multithreading - 如何保证 GPars 线程池中任务的执行/呈现顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29979646/