0

我有这段代码:

class GitDownloader extends DefaultActor {

    private String dir

    @Override
    protected void act() {
        loop {
            react {
                repos -> if (repos instanceof String[])
                    println "Total Repos: ${repos.size()}"
                    repos.each {
                        repo ->
                            "git clone ssh://git@bar-src.foo.com/${repo} ${dir}/${repo.split("/").last()}".execute()
                    }
            }
        }
    }
}

我这样开始:

def gitDownloader = new GitDownloader(dir: sourceCodeFolder)
gitDownloader.start()
gitDownloader << repositories

问题是任务以随机顺序执行。它应该git clone像 repos.size() 一样多次运行该命令,但事实并非如此。它每次运行随机次数。

each循环应该作为单个任务在后台执行,似乎git clone命令是并行执行的。

4

1 回答 1

2

如果您要发送一个列表,它将是一个接收到的列表......

以下代码:

import groovyx.gpars.actor.*

class GitDownloader extends DefaultActor {

    private String dir

    @Override
    protected void act() {
        loop {
            react { repos -> 
                println "Got an ${repos.getClass()} of repos"
                repos.each {
                    repo ->
                        println "doing $repo for dir $dir"
                }
            }
        }
    }
}

def g = new GitDownloader(dir:'woo')
g.start()
g << ['a', 'b']

印刷:

Got an class java.util.ArrayList of repos
doing a for dir woo
doing b for dir woo

这似乎按预期工作......

或将其更改为一次做一个(添加睡眠以模拟正在完成的一些工作)

import groovyx.gpars.actor.*

class GitDownloader extends DefaultActor {

    private String dir

    @Override
    protected void act() {
        loop {
            react { repo -> 
                println "Got an ${repo.getClass()} of repos"
                println "doing $repo for dir $dir"
                Thread.sleep(1000)
            }
        }
    }
}

def g = new GitDownloader(dir:'woo')
g.start()
g << 'a' << 'b'
g

也有效,并打印:

Got an class java.lang.String of repos
doing a for dir woo
Got an class java.lang.String of repos
doing b for dir woo

从您的代码中,我看不到问题(除此之外String[]

于 2015-11-12T15:05:47.857 回答