multithreading - 如何保证 GPars 线程池中任务的执行/呈现顺序?

标签 multithreading groovy gpars

我正在使用 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/

相关文章:

.net - Delegate.BeginInvoke 和 Thread.Start 之间的区别

C++无锁线程同步

grails - 尝试使循环与GPar并行执行失败

Groovy GPars,启动的每个线程都需要索引

java - while 循环中有/没有 System.out.println() 的奇怪输出

c# - 程序设计问题,filesystemwatcher,多线程C#

java - 如何在 IntelliJ IDEA 中修复 "unsupported class file major version 60"?

grails - Groovy,Grails;每周为变量添加+1

unit-testing - 如何在Groovy脚本中设置退出状态

groovy - GPars:WAITING Actor 完成