首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FileTree文件的异步操作?

FileTree文件的异步操作?
EN

Stack Overflow用户
提问于 2011-09-01 08:18:14
回答 2查看 441关注 0票数 2

有没有一种方法可以让我很容易地在gradle任务中智能地处理FileTree文件?我基本上需要等待所有文件的执行,就像你可以用GPars做的那样,但是我怎么用FileTree来做这个呢?

代码语言:javascript
复制
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)这样的事情,那就太好了,但我在谷歌上搜索了一下,什么也没找到。有没有一种方法可以很容易地让它成为多线程的?一个元素的处理不会影响任何其他元素的处理。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-09-01 11:41:22

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

  • 在同一个JVM中运行所有的东西。为每个输入文件派生一个新的JVM非常inefficient.
  • Make压缩任务增量,这样它只在一些输入文件自上次运行以来发生变化时才执行。
  • 直接运行minifier,而不是通过Ant (保存为每个输入文件创建一个新的类加载器;不确定这是否重要)。

如果这仍然让你对性能不满意,并且你不能使用性能更好的minifier,你仍然可以尝试多线程。Gradle不会在这方面帮到你,但是像GPars或Java Fork/Join框架这样的库会帮到你。

票数 3
EN

Stack Overflow用户

发布于 2011-09-02 11:26:02

GPars解决方案。请注意,可以修改compress()函数以正确接受源目录/目标目录/等,但由于我所有的名称都是一致的,所以我现在只使用一个参数。我能够将我的构建时间从7.3s缩短到5.4s,并且只缩减了3个文件。我见过构建时间失控,所以我总是对这种行为的性能保持警惕。

代码语言:javascript
复制
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')
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7264927

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档