Параллельно работает одно и то же задание с разными параметрами?
Я хотел бы запустить два gatlingRun
задачи (созданные плагином Gatling Gradle) с разными параметрами (в двух средах) одновременно.
Я знаю, что новый Gradle предоставляет Worker API, но это, похоже, не применимо в этом случае.
1 ответ
Как вы сказали, Gradle Worker API не очень применим в вашем случае, потому что он позволяет параллельную обработку, но в контексте одной Задачи, как указано в документации:
Worker API предоставляет возможность разбить выполнение действия задачи на отдельные единицы работы, а затем выполнять эту работу одновременно и асинхронно.
Чтобы различные задачи выполнялись параллельно, вы можете использовать функцию параллельного выполнения. Но учтите, что вы можете запускать задачи параллельно, только если они принадлежат разным подпроектам (одной и той же многопроектной сборки):
Большинство сборок состоит из более чем одного проекта, и некоторые из этих проектов обычно независимы друг от друга. Тем не менее, Gradle будет запускать только одну задачу за раз по умолчанию, независимо от структуры проекта (это будет улучшено в ближайшее время). Используя ключ --parallel, вы можете заставить Gradle выполнять задачи параллельно, если эти задачи находятся в разных проектах.
Если ваш сценарий сборки используется "только" в качестве средства запуска для нагрузочных тестов 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
работать параллельно.
Но в вашем реальном случае это все еще не осуществимо.
Рабочий API должен использоваться из реализации задачи, а GatlingRunTask его не использует.
Вы или автор плагина должны переписать реализацию задачи, чтобы использовать Worker API внутри.