执行命令';s和ZIP文件夹在Go中为异步

执行命令';s和ZIP文件夹在Go中为异步,go,Go,我有一个程序,它通过cmd:=exec.command(name,args…) 现在程序正在为10个(或更多)不同的目录执行此操作, 我的意思是,我为给定路径的10个不同目录运行npm install。 其思想是等待执行过程结束,然后压缩整个文件夹(运行命令npm install的地方) 这里的问题是,当wait块执行时,程序停止并等待(当然应该这样做…),但我想进入下一个目录,而不是等待wait(每个目录执行)完成 建议如何充分处理? 我的意思是在执行模块和 此外,当特定命令完成后,无论程序现

我有一个程序,它通过
cmd:=exec.command(name,args…)
现在程序正在为10个(或更多)不同的目录执行此操作, 我的意思是,我为给定路径的10个不同目录运行
npm install
。 其思想是等待执行过程结束,然后压缩整个文件夹(运行命令npm install的地方) 这里的问题是,当
wait
块执行时,程序停止并等待(当然应该这样做…),但我想进入下一个目录,而不是等待
wait
(每个目录执行)完成

建议如何充分处理? 我的意思是在执行模块和 此外,当特定命令完成后,无论程序现在何时在指定的目录上运行,都会自动压缩它

对于不同的目录,此函数在循环中调用10次

func (n Node) Build(path string) error {
    //e.g. Run npm install which build's nodejs project
    command := exec.Command("npm", "install")
    command.Dir = n.path

 //start the execution 
  if err := command.Start(); err != nil {
    log.Printf("Failed to start cmd: %v", err)
  }



// Here I waiting to command to finish to zip the folder
if err := command.Wait(); err != nil {
   // Zip folder
}



  }
主要函数调用它,如下所示

func main() {

//Here I have loop which 

for _, dir := range dirs {

    switch dir.name {
    case "Java":
        Build(&Java{path})
    case "Go":
        Build(&Golang{path,cgoOptions},) 
    case "Node":
        Build(&Node{path})
    }
}
类似于这个帖子

您只需启动尽可能多的文件夹来并行执行您的程序,然后等待所有goroutine使用

例如:

import "sync"

func (n Node) Build(wg sync.WaitGroup, path string) error {
    wg.Add(1)
    defer wg.Done()

    //e.g. Run npm install which build's nodejs project
    command := exec.Command("npm", "install")
    command.Dir = n.path

    //start the execution 
    if err := command.Start(); err != nil {
        log.Printf("Failed to start cmd: %v", err)
    }

    // Here I waiting to command to finish to zip the folder
    if err := command.Wait(); err != nil {
       // Zip folder
    } 
}

func main() {
    var wg sync.WaitGroup
    node := ...
    for _, path := range dirs {
        go node.Build(wg, path)
    }

    wg.Wait()
}

UPD:一些解释。我们需要在主进程和所有goroutine之间共享wait group对象。我们可以将goroutine视为执行的逻辑线程。等待组作为线程安全的共享计数器变量。在我们的例子中,每个goroutine都是一个逻辑作业。这就是为什么在退出
Build()
函数之前,我们在线程开始时通过调用将等待组内部计数器增加
1
,并将其减少
1
。等待组的方法只是阻止主进程的执行,直到内部计数器再次变为0。

性能?如果您的文件很大,避免复制将是一个很大的优势。您有两个选择,您想知道哪一个性能更好,所以请尝试每一个,测量每个文件的性能,并进行比较。谢谢,您能否详细说明什么是
wg.Add(1)
,我是否应该为其提供外部计数器?