如何保证 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)}
这将保证您想要的启动顺序。
我正在 运行使用 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)}
这将保证您想要的启动顺序。