728x90
반응형
신규 서버를 만들면서 두가지 기능이 필요했다.
첫째는 명령어를 동시에 실행해서 속도를 높이는 것과 데이터가 있는 디렉토리를 제거하는 것이었다.
-
명령어 동시 실행하기
Golang
에서 WaitGroup
은 모든 goroutine
이 종료될 때까지 기다린다.
채널을 통해서 커맨드를 전달하고 goroutine
에서 이 커맨드를 실행하고 종료한다.
명령어를 단순 반복문으로 수행하면 오래 걸리지만 이를 활용하면 빠르게 수행할 수 있었다.
tasks := make(chan *exec.Cmd, 64)
var wg sync.WaitGroup
for i := 0; i < 10; i++ {
wg.Add(1)
go func(w *sync.WaitGroup) {
defer w.Done()
for cmd := range tasks {
out, err := cmd.Output()
if err != nil {
fmt.Println("can't get stdout: %v", err)
}
fmt.Println(string(out))
}
}(&wg)
}
for i := 0; i < 10; i++ {
tasks <- exec.Command("echo", strconv.Itoa(i))
}
close(tasks)
wg.Wait()
-
디렉토리 제거(rm -rf)
간단하게 exec.Command
를 활용하면 되겠지만 최대한 Golang
함수로 해결해보려고 했다.
그래서 아래와 같이 디렉토리 밑의 데이터를 지우고 마지막으로 디렉토리를 삭제하도록 했다.
func removeContents(dir string) error {
d, err := os.Open(dir)
if err != nil {
return err
}
defer d.Close()
names, err := d.Readdirnames(-1)
if err != nil {
return err
}
for _, name := range names {
err = os.RemoveAll(filepath.Join(dir, name))
if err != nil {
return err
}
}
syscall.Rmdir(dir)
return nil
}
참고 문헌
반응형
'Golang' 카테고리의 다른 글
[Golang] too many open files 에러 해결 (0) | 2020.08.06 |
---|---|
[Golang] Echo 파일 업로더 서버 구축 (0) | 2020.07.30 |
[Golang] Go의 선(The Zen of Go) (0) | 2020.06.04 |
[Golang] Kafka 연동 문제 (0) | 2020.04.30 |
[Golang] Go를 사용하면서 발생했던 문제들 (0) | 2020.04.23 |