Appearance
Worker API
Worker API 允许在单个任务中并行执行独立的工作单元,充分利用多核 CPU。
三种隔离模式
| 隔离模式 | 说明 | 适用场景 |
|---|---|---|
noIsolation() | 同一进程,共享 classloader | 简单的并行逻辑 |
classLoaderIsolation() | 同一进程,独立 classloader | 需要不同依赖版本 |
processIsolation() | 独立进程 | 需要完全隔离,如 Groovy 编译 |
基本示例
kotlin
// 工作参数
interface TransformParameters : WorkParameters {
val inputFile: RegularFileProperty
val outputFile: RegularFileProperty
val encoding: Property<String>
}
// 工作动作
abstract class TransformAction : WorkAction<TransformParameters> {
override fun execute() {
val input = parameters.inputFile.get().asFile
val output = parameters.outputFile.get().asFile
val enc = parameters.encoding.get()
output.parentFile.mkdirs()
output.writeText(input.readText(charset(enc)).uppercase(), charset(enc))
println("处理完成:${input.name}")
}
}
// 任务
abstract class TransformTask @Inject constructor(
private val workerExecutor: WorkerExecutor
) : DefaultTask() {
@get:InputDirectory
abstract val sourceDir: DirectoryProperty
@get:OutputDirectory
abstract val outputDir: DirectoryProperty
@TaskAction
fun transform() {
val queue = workerExecutor.noIsolation()
sourceDir.get().asFile.walkTopDown()
.filter { it.isFile && it.extension == "txt" }
.forEach { file ->
queue.submit(TransformAction::class.java) {
inputFile.set(file)
outputFile.set(File(outputDir.get().asFile, file.name))
encoding.set("UTF-8")
}
}
// 不需要手动等待,Gradle 自动等待所有工作完成
}
}进程隔离(适用于第三方工具)
kotlin
abstract class RunExternalToolTask @Inject constructor(
private val workerExecutor: WorkerExecutor
) : DefaultTask() {
@TaskAction
fun run() {
val queue = workerExecutor.processIsolation {
classpath.from(configurations["externalToolClasspath"])
forkOptions {
maxHeapSize = "512m"
jvmArgs("-XX:+UseG1GC")
}
}
queue.submit(ExternalToolAction::class.java) {
// 参数配置
}
}
}