【问题标题】:How can I guarantee order of execution/presentation of tasks in GPars threadpool?如何保证 GPars 线程池中任务的执行/呈现顺序?
【发布时间】:2015-04-30 23:48:48
【问题描述】:

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

幸运的是,features 列表中的最后一个任务运行时间最长,因此当所有其他线程都完成时,整个进程会在那里执行 runtest('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?

【问题讨论】:

    标签: multithreading groovy gpars


    【解决方案1】:

    对于这样的情况,我建议使用从“特征”的排序集合上的顺序 for 循环中开始的数据流任务,而不是并行集合:

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

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

    【讨论】:

    • 瓦茨拉夫非常感谢您的帮助。我将DefaultPGroup(4) 用于group,然后在测试结束时使用group.shutdown() 以确保它们完成。测试仍然提前结束。任何想法为什么?我认为 shutdown() 应该是礼貌的:-)
    • 您必须等待任务完成,可能类似于: features.collect {group.task{runtest(it)}}*.join() - “task” 方法返回一个 Promise对于每个启动的任务,在您关闭()池之前,您应该确保在所有 Promises 上调用 join()。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2011-11-03
      • 1970-01-01
      • 2017-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-28
      • 2013-07-22
      • 1970-01-01
      相关资源
      最近更新 更多