Параллельно запускать одну и ту же задачу gradle с разными параметрами?

Я хотел бы запустить две задачи gatlingRun (созданные плагином gatling gradle) с разными параметрами (в 2 средах) одновременно.

Я знаю, что новый gradle предоставляет Worker API, но в данном случае это не применимо.

1
0
1 028
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Как вы сказали, Gradle Рабочий API на самом деле неприменим в вашем случае, потому что он позволяет параллельную обработку, но в контексте одного Задача, как указано в документации:

The Worker API provides the ability to break up the execution of a task action into discrete units of work and then to execute that work concurrently and asynchronously.

Чтобы разные задачи выполнялись параллельно, вы могли бы использовать функцию Параллельное исполнение. Но обратите внимание, что вы можете запускать задачи параллельно, только если они принадлежат разным подпроектам (одной и той же многопроектной сборки):

Most builds consist of more than one project and some of those projects are usually independent of one another. Yet Gradle will only run one task at a time by default, regardless of the project structure (this will be improved soon). By using the --parallel switch, you can force Gradle to execute tasks in parallel as long as those tasks are in different projects.

Если ваш сценарий сборки используется «только» как средство запуска для нагрузочных тестов Gatlin, то, возможно, вы можете реализовать свой сценарий сборки как многопроектную сборку с одним подпроектом для каждой целевой среды для тестирования; тогда вы можете включить опцию --parallel для параллельного выполнения задач нагрузочного теста.

@ M.Ricciuti ошибается в способностях Worker API.

Документация Gradle по этому поводу расплывчата, но Я спросил и получил ответ этот 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')

Предполагая, что у вас многоядерный процессор или задано свойство gradle.workers.max, задачи sleep5 и sleep10 выполняются параллельно.

Но в вашем случае это все еще невозможно.

Worker API должен использоваться из реализации задачи, а GatlingRunTask его не использует.

Вы или автор плагина должны переписать реализацию задачи, чтобы использовать Worker API внутри.

Другие вопросы по теме