私は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
調べ、ゴルーチン内の各ファイルに対して a を実行します。したがって、これはディレクトリに存在するファイルの数であるn
ゴルーチンを生成します。メインは、すべてのゴルーチンが作業を完了するまで待機します。n
/tmp
興味深いことに、このプログラムの実行には、ゴルーチンの有無にかかわらず同じ時間がかかります。go grep (path, c)
and を実行してみてくださいgrep (path, c)
(これを行うときは、チャンネルの内容にコメントする必要があります)。
複数のgrepが同時に実行されるため、ゴルーチンバージョンがより高速に実行されることを期待していました。しかし、ほぼ同じ時間で実行されます。なぜこれが起こるのだろうか?