FileTree文件的异步操作?

时间:2011-09-01 00:18:14

标签: multithreading build gradle filetree

有没有办法可以轻松地在gradle任务中以智能方式处理FileTree个文件?我基本上需要等待所有文件的执行,就像你可以用GPars做的那样,但我如何用FileTree做这个gradle?

task compressJs(dependsOn: [copyJsToBuild]) << {
    println 'Minifying JS'

    fileTree {
        from 'build/js'
        include '**/*.js'
    }.visit { element ->
        if (element.file.isFile()) {
            println "Minifying ${element.relativePath}"
            ant.java(jar: "lib/yuicompressor-2.4.6.jar", fork: true) {
                arg(value: "build/js/${element.relativePath}")
                arg(value: "-o")
                arg(value: "build/js/${element.relativePath}")
            }
        }
    }
}

如果我可以做.visit{}.async(wait:true)这样的事情,那将是可爱的,但我的谷歌搜索没有任何结果。有没有办法可以轻松制作这种多线程?处理一个元素对任何其他元素的处理没有影响。

2 个答案:

答案 0 :(得分:3)

在考虑进行多线程之前,我会尝试以下方法:

  • 在同一个JVM中运行所有内容。为每个输入文件分配新的JVM是非常低效的。
  • 使compressJs任务增量,以便仅在上次运行后某些输入文件发生更改时才执行。
  • 直接运行minifier而不是通过Ant(为每个输入文件保存新的类加载器;不确定是否重要)。

如果这仍然让您对性能不满意,并且您无法使用性能更高的缩放器,您仍然可以尝试使用多线程。 Gradle将不会帮助你(但是),但像GPars或Java Fork / Join框架这样的库会。

答案 1 :(得分:1)

GPars解决方案。请注意,可以修改compress()函数以正确接受源目录/目标目录/等,但由于我的所有名称都是一致的,所以我现在只使用一个参数。我能够将构建时间从7.3s减少到5.4s,只有3个文件被缩小。我已经看到构建时间失控,所以我总是对这种行为的表现持谨慎态度。

import groovyx.gpars.GParsPool

buildscript {
    repositories {
        mavenCentral()
    }

    dependencies {
        classpath 'org.codehaus.gpars:gpars:0.12'
    }
}

def compress(String type) {
    def elementsToMinify = []
    fileTree {
        from type
        include "**/*.$type"
    }.visit { element ->
        if (element.file.isFile()) {
            elementsToMinify << element
        }
    }

    GParsPool.withPool(8) {
        elementsToMinify.eachParallel { element ->
            println "Minifying ${element.relativePath}"
            def outputFileLocation = "build/$type/${element.relativePath}"
            new File(outputFileLocation).parentFile.mkdirs()
            ant.java(jar: "lib/yuicompressor-2.4.6.jar", fork: true) {
                arg(value: "$type/${element.relativePath}")
                arg(value: "-o")
                arg(value: outputFileLocation)
            }
        }
    }
}

task compressJs {
    inputs.dir new File('js')
    outputs.dir new File('build/js')

    doLast {
        compress('js')
    }
}

task compressCss {
    inputs.dir new File('css')
    outputs.dir new File('build/css')

    doLast {
       compress('css')
    }
}