Skip to content

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) {
            // 参数配置
        }
    }
}

下一步