并行运行具有不同参数的相同gradle任务?

时间:2018-10-31 12:10:32

标签: gradle gatling-plugin

我想同时运行两个gatlingRun任务(由gatling gradle插件创建),它们具有不同的参数(在2个环境中)。

我知道新的gradle提供了Worker API,但这在这种情况下似乎不适用。

2 个答案:

答案 0 :(得分:1)

就像您说的那样,Gradle Worker API并不是真正适用于您的情况,因为它支持并行处理,但是在单个 Task 的上下文中,如文档所述:

  

Worker API提供了将任务动作的执行分解为离散的工作单元,然后同时并异步执行该工作的功能。

为了使不同的任务并行运行,您可以使用Parallel execution功能。但是请注意,只有当任务属于不同的子项目(相同的多项目版本)时,您才能并行运行任务:

  

大多数构建都包含一个以上的项目,其中一些项目通常是彼此独立的。然而,不管项目结构如何,默认情况下,Gradle一次只能运行一项任务(这将很快得到改善)。通过使用--parallel开关,您可以强制Gradle并行执行任务,只要这些任务位于不同的项目中即可。

如果将构建脚本“仅”用作Gatlin负载测试的启动器,则也许可以将构建脚本实现为多项目构建,每个目标环境都可以测试一个子项目;那么您可以启用--parallel选项来并行执行负载测试任务。

答案 1 :(得分:0)

@ M.Ricciuti在辅助API能力上是错误的。

Gradle的文档对此含糊不清,但是I asked and got the answer确实,Worker API允许我们在同一项目中并行运行多个任务。

这是一个有效的示例,具有不同类的任务:

import javax.inject.Inject

class Sleeping5 extends DefaultTask {
  static class Sleeper5 implements Runnable {
    String name
    @Inject
    public Sleeper5(String name) {
      this.@name = name
    }
    @Override
    void run() {
      (1..50).each { int i ->
        Thread.sleep(1000)
        println "$name: $i"
      }
    }
  }
  private final WorkerExecutor workerExecutor
  @Inject
  public Sleeping5(WorkerExecutor workerExecutor) {
    this.workerExecutor = workerExecutor
  }
  @TaskAction
  void sleep() {
    workerExecutor.submit(Sleeper5, new Action<WorkerConfiguration>() {
      @Override
      void execute(WorkerConfiguration config) {
        config.isolationMode = IsolationMode.NONE
        config.displayName = name
        config.params = [name]
      }
    })
  }
}

class Sleeping10 extends DefaultTask {
  static class Sleeper10 implements Runnable {
    String name
    @Inject
    public Sleeper10(String name) {
      this.@name = name
    }
    @Override
    void run() {
      (1..70).each { int i ->
        Thread.sleep(1000)
        println "$name: $i"
      }
    }
  }
  private final WorkerExecutor workerExecutor
  @Inject
  public Sleeping10(WorkerExecutor workerExecutor) {
    this.workerExecutor = workerExecutor
  }
  @TaskAction
  void sleep() {
    workerExecutor.submit(Sleeper10, new Action<WorkerConfiguration>() {
      @Override
      void execute(WorkerConfiguration config) {
        config.isolationMode = IsolationMode.NONE
        config.displayName = name
        config.params = [name]
      }
    })
  }
}
task(type: Sleeping5, 'sleep5')
task(type: Sleeping10, 'sleep10')

假设您具有多核CPU或设置了gradle.workers.max属性,则任务sleep5sleep10并行运行。

但是,在您的实际情况下,这仍然不可行。

应该从任务实现中使用Worker API,而GatlingRunTask没有使用它。

您或插件作者必须重写任务实现才能在内部使用Worker API。