Параллельно работает одно и то же задание с разными параметрами? - PullRequest
0 голосов
/ 31 октября 2018

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

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

Ответы [ 2 ]

0 голосов
/ 23 декабря 2018

@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 выполняются параллельно.

Но в вашем реальном случае это все еще не осуществимо.

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

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

0 голосов
/ 31 октября 2018

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

Worker API предоставляет возможность разбивать выполнение действия задачи на отдельные единицы работы, а затем выполнять эту работу одновременно и асинхронно.

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

Большинство сборок состоит из более чем одного проекта, и некоторые из этих проектов обычно независимы друг от друга. Тем не менее, Gradle будет выполнять только одну задачу за раз по умолчанию, независимо от структуры проекта (это будет улучшено в ближайшее время). Используя ключ --parallel, вы можете заставить Gradle выполнять задачи параллельно, если эти задачи находятся в разных проектах.

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

...