Go言語のgorutineゴルーチン実装比較について

Go言語のgorutineゴルーチン、並列処理において、go func()をただつかっただけの実装Aと、
チャンネルとワーカを作成し並列処理を書いた実装B とどちらが処理は効率的(速さ、リソースの点で)でしょうか?デメリット、メリット知りたいです。
※サーバコンテナ(APIサーバ想定)のメモリは4Gでコア2つ、検索するデイレくトリ配下のファイルは500以上の想定
すみません、消去ロジックのLinuxコマンド(実装A)とgoのパッケージを使う(実装B)差異は観点にいれない無視でお願いします。
よろしくお願いします。

実装A
// 削除を実行する
go func() {
cmd := exec.Command("find", mpddir, "-name", "test_*.txt", "-mtime", "+1", "-exec", "rm", "-f", "{}", "\;")

cmd.Stderr = &stderr err := cmd.Run() if err != nil { lg.LW(err, "failed to remove mpd file : [%s]", mpddir) lg.LEM("error: %s", stderr.String()) } lg.LTM("execute command-[%s]", cmd.String()) // 排他制御ファイルを削除 if err := os.Remove(mpddir + "/.lock"); err != nil { lg.LW(err, "failed to remove lock file : [%s]", mpddir) } lg.LTM("execute remove lock file : [%s]", mpddir+"/.lock") }()

//////////////////////

実装B 
// ファイル削除を並列処理で実行するためのチャネル
type fileTask struct {
path string
modTime time.Time
}
taskChan := make(chan fileTask, 50)

// エラーチャネル errorChan := make(chan error, 1) // ワーカーを起動 var wg sync.WaitGroup const numWorkers = 2 for i := 0; i < numWorkers; i++ { wg.Add(1) go func() { defer wg.Done() for task := range taskChan { // ファイルが24時間より前のものかどうかをチェック if task.modTime.Before(time.Now().Add(-24 * time.Hour)) { if err := os.Remove(task.path); err != nil { lg.LEM("Failed to remove file. path: %s, err: %v", task.path, err) errorChan <- err } else { lg.LBM("Removed file. path: %s", task.path) } } } }() } // ファイルを探索し、タスクをチャネルに送る go func() { defer close(taskChan) err := filepath.Walk(mpddir, func(path string, info os.FileInfo, err error) error { if err != nil { return err } // ファイル名がパターンに一致するかどうかをチェック if matched, _ := filepath.Match(`test_*.text`, info.Name()); matched { taskChan <- fileTask{path: path, modTime: info.ModTime()} } return nil }) if err != nil { errorChan <- lg.LEM("Failed to walk the path. mpddir: %s, err: %v", mpddir, err) } }() // ワーカーが全て終了するのを待つ wg.Wait() close(errorChan) // エラーが発生していた場合最初のエラーを返す if err := <-errorChan; err != nil { return err }

コメントを投稿

0 コメント