如何保证 GPars 线程池中 execution/presentation 个任务的顺序?

How can I guarantee order of execution/presentation of tasks in GPars threadpool?

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

幸运的是,features 列表中的最后一个任务耗时最长,达到 运行,因此整个过程坐在那里执行 运行test('australian_government_rebate.feature') 当所有其他线程都已完成时持续 25 分钟。

这意味着多线程没有兑现它的承诺。单线程测试需要 65 分钟到 运行,多线程测试需要 48 分钟。我希望有 30 分钟或更长时间。

我的解决方案是按之前的执行时间对特征文件进行排序:

features = ...
features.sort { a, b -> b.executionTime() <=> a.executionTime() }
GParsPool.withPool(noOfCores) {
    features.eachParallel { feature ->
        runtest(feature)
    }
}

我的问题是:我能否保证这些功能将按照它们在 features 中出现的顺序呈现给 GParsPool?

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

对于这种情况,我建议使用从排序集合 "features" 的顺序 for 循环中开始的数据流任务,而不是并行集合:

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

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