2016-05-21 7 views
1

Ich habe eine Aufgabe, die im Wesentlichen die folgenden ausführt:parallelize Code in einer gradle Aufgabe

['subproj1', 'subproj2'].each { proj -> 
    GradleRunner.create() 
     .withProjectDir(file("./examples/${proj}/")) 
     .withArguments('check') 
     .build() 
} 

Die Prüfung ist ein Systemtest und erfordert zu 3rd-Party-Dienste verbinden, so möchte ich dies parallelisieren.

Kann dies in Großbuchstaben erfolgen? Wenn das so ist, wie?

Ich versuchte mit Java-Threading, aber die Builds scheiterten mit Fehlern, die ich nicht erinnern kann, was sie genau waren, aber sie deuteten an, dass der innere Grad des Graple beschädigt worden war.

Antwort

2

Haben Sie versucht, die experimentelle parallele Taskausführung zu verwenden? Auf den ersten Blick ist es ganz einfach. Sie rufen einfach ./gradlew --parallel überprüfen (oder wenn es sich herausstellt, für Sie gut zu funktionieren, können Sie dies auch in Ihrer gradle.properties definieren). Dies startet n Threads (wobei n die Anzahl der CPU-Kerne ist), die Ihre Aufgaben ausführen. Jeder Thread besitzt ein bestimmtes Projekt, so dass die Aufgaben eines Projekts niemals parallel ausgeführt werden.

Sie können die Anzahl der Aufgaben (oder des Arbeiters) überschreiben, indem Sie die Eigenschaft --max-workers in der Befehlszeile oder org.gradle.workers.max=n in Ihrem gradle.properies festlegen.

Wenn Sie nur daran interessiert sind, Tests parallel auszuführen, können Sie versuchen, Test.setMaxParallelForks(int) zu setzen. Das führt dazu, dass die Tests eines Projekts (wenn ich das richtig verstanden habe) parallel ausgeführt werden (mit der Anzahl der von Ihnen definierten Aufgaben).

Hoffnung, das hilft. Vielleicht ist die gradle Dokumentation Ihnen einige weitere Einblicke gibt: https://docs.gradle.org/current/userguide/multi_project_builds.html#sec:parallel_execution

+1

ich diesen Parameter gesehen hatte, Aber leider scheint dies zu erfordern, dass Projekte als Multi-Projekt-Builds eingerichtet werden, die meiner nicht sind. Vielleicht muss ich umgestalten. –

+0

Aber wenn sie kein Multiprojekt sind, können Sie sie komplett unabhängig voneinander ausführen. Wenn Sie gradle aufrufen, dann tun Sie dies, um ein Projekt zu erstellen (das möglicherweise aus verschiedenen Teilprojekten besteht). Ich habe sie nur als Multiprojekt-Build vorgeschlagen, weil Sie sie Teilprojekt [1,2,3] genannt haben. – TobiSH

+0

Vielleicht könnten Sie mehr Einblicke darüber geben, wie Ihr Setup ist. Es ist nicht immer eine gute Idee, ein großes Projekt mit vielen Teilprojekten zu haben. Meine Faustregel wäre: Wenn ein bestimmter Teil der Software einen Lebenszyklus hat (Build, Release, Deploy), sollte es ein eigenständiges Projekt sein. – TobiSH

0

Während Multi Build der richtige Weg ist auf lange Sicht, meine kurzfristigen Ansatz zu gehen war GPars zu verwenden:

import groovyx.gpars.GParsPool 

buildscript { 
    repositories { 
     mavenCentral() 
    } 
    dependencies { 
     classpath "org.codehaus.gpars:gpars:1.1.0" 
    } 
} 

task XXXX << { 
    GParsPool.withPool(10) { 
     ['subproj1', 'subproj2'].eachParallel { proj -> 
      GradleRunner.create() 
       .withProjectDir(file("./examples/${proj}/")) 
       .withArguments('check') 
       .build() 
     } 
    } 
} 
Verwandte Themen