0
0
Go言語のgorutineゴルーチン、並列処理において、go func()をただつかっただけの実装Aと、
チャンネルとワーカを作成し並列処理を書いた実装B とどちらが処理は効率的(速さ、リソースの点で)でしょうか?デメリット、メリット知りたいです。
※サーバのメモリは4Gでコア2つ、検索するデイレくトリ配下のファイルは300以上-1000の想定
すみません、消去ロジックの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()) }()
実装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 }
回答2件
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。