执行命令';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)
,我是否应该为其提供外部计数器?