我正在学习 Go 编程语言。请考虑以下程序,
package main
import (
"fmt"
"bytes"
"os"
"os/exec"
"path/filepath"
"sync"
)
func grep(file string) {
defer wg.Done()
cmd := exec.Command("grep", "-H", "--color=always", "add", file)
var out bytes.Buffer
cmd.Stdout = &out
cmd.Run()
fmt.Printf("%s\n", out.String())
}
func walkFn(path string, info os.FileInfo, err error) error {
if !info.IsDir() {
wg.Add(1)
go grep (path)
}
return nil
}
var wg sync.WaitGroup
func main() {
filepath.Walk("/tmp/", walkFn)
wg.Wait()
}
该程序遍历/tmp
目录中的所有文件,并grep
在 goroutine 中对每个文件执行 a。所以这将产生n
goroutines目录n
中存在的文件数量/tmp
。Main 等待所有 goroutine 完成工作。
有趣的是,这个程序在使用和不使用 goroutine 的情况下都需要相同的时间来执行。尝试运行go grep (path, c)
和grep (path, c)
(执行此操作时您需要评论频道内容)。
我期待 goroutine 版本运行得更快,因为多个 grep 同时运行。但它几乎在相同的时间内执行。我想知道为什么会这样?