상식닷컴
로그인
가입하기
2026년 상식닷컴 선정 식당 & 카페 리스트
2025년 2026년 신상 호텔 리스트
최근에 오픈한 호텔을 찾는다면 살펴보세요
일주일 식단표 어플
자동 일주일 식단표 어플
안드로이드
아이폰
주식 & 코인 차트의 신
1000만원으로 2000만원 만들기 프로젝트
궁금한 상식 보기
월마트의 소비자 행동 분석 방법은 무엇인가요?
수박을 고를 때 어떤 점을 주의해야 하나요?
수박의 껍질을 이용한 차가운 음료는 어떻게 만들 수 있나요?
수박을 자주 먹는 것이 체중 관리에 도움이 될까요?
유배 중의 심리적 고통은 어떤 것인가요?
파운드 단위는 왜 국제 표준이 되지 않았나요?
노벨상 수상자는 어떤 학문적 전통을 이어갔나요?
3월에 추천하는 여행 패키지는?
5월에 가볼 만한 축제나 행사에는 어떤 것들이 있나요?
5월에 여행할 때 필요한 보험은 어떤 것이 있나요?
4월에 가기 좋은 사진 촬영 팁은?
6월에 추천하는 로드트립 코스는?
Previous
Next
수정하기 - Go에서 고루틴의 종료를 감지하는 방법은 무엇인가요?
닉네임
비밀번호
제목
내용
[이미지 업로드는 권한이 있는 사람만 가능. 하단 카톡으로 연락]
Go에서 고루틴(goroutine)의 종료를 감지하는 방법은 여러 가지가 있으며, 주로 채널(channels)과 `sync.WaitGroup`을 사용하여 구현합니다. 아래에서 이 두 가지 방법을 자세히 설명하겠습니다. 1. 채널을 사용한 종료 감지 고루틴이 종료될 때 특정 신호를 보내기 위해 채널을 사용할 수 있습니다. 이 방법은 고루틴이 작업을 완료했음을 다른 고루틴이나 메인 함수에 알리는 데 유용합니다. 예제 코드: ```go package main import ( "fmt" "time" ) func worker(done chan bool) { fmt.Println("작업 시작") time.Sleep(2 * time.Second) // 작업 시뮬레이션 fmt.Println("작업 완료") done <- true // 작업이 완료되었음을 알림 } func main() { done := make(chan bool) go worker(done) // 고루틴 시작 <-done // 고루틴의 종료를 기다림 fmt.Println("고루틴이 종료되었습니다.") } ``` 위의 예제에서 `worker` 함수는 고루틴으로 실행되며, 작업이 완료되면 `done` 채널에 `true` 값을 전송합니다. 메인 함수는 이 채널을 통해 고루틴의 종료를 감지합니다. 2. `sync.WaitGroup`을 사용한 종료 감지 `sync.WaitGroup`은 여러 고루틴의 종료를 기다리는 데 유용한 구조체입니다. `Add`, `Done`, `Wait` 메서드를 사용하여 고루틴의 수를 관리하고, 모든 고루틴이 완료될 때까지 대기할 수 있습니다. 예제 코드: ```go package main import ( "fmt" "sync" "time" ) func worker(wg *sync.WaitGroup) { defer wg.Done() // 고루틴이 종료될 때 호출 fmt.Println("작업 시작") time.Sleep(2 * time.Second) // 작업 시뮬레이션 fmt.Println("작업 완료") } func main() { var wg sync.WaitGroup for i := 0; i < 3; i++ { wg.Add(1) // 고루틴 수 증가 go worker(&wg) // 고루틴 시작 } wg.Wait() // 모든 고루틴이 종료될 때까지 대기 fmt.Println("모든 고루틴이 종료되었습니다.") } ``` 위의 예제에서 `worker` 함수는 `sync.WaitGroup`을 사용하여 고루틴의 종료를 관리합니다. 메인 함수는 모든 고루틴이 종료될 때까지 `wg.Wait()`를 호출하여 대기합니다. 3. Context 패키지를 사용한 종료 감지 Go의 `context` 패키지를 사용하여 고루틴의 종료를 감지하고, 필요할 경우 고루틴을 <a href='https://sangseek.com/sangseeks/취소/ko'>취소</a>할 수 있습니다. 이 방법은 특히 HTTP 서버와 같은 <a href='https://sangseek.com/sangseeks/장기 실행/ko'>장기 실행</a> 작업에서 유용합니다. 예제 코드: ```go package main import ( "context" "fmt" "time" ) func worker(ctx <a href='https://sangseek.com/sangseeks/context.Context/ko'>context.Context</a>) { fmt.Println("작업 시작") select { case <-time.After(2 * time.Second): // 작업 시뮬레이션 fmt.Println("작업 완료") case <-ctx.Done(): // 컨텍스트가 취소되면 fmt.Println("작업 취소됨") } } func main() { ctx, cancel := context.WithCancel(<a href='https://sangseek.com/sangseeks/context.Background()/ko'>context.Background()</a>()) go worker(ctx) // 고루틴 시작 time.Sleep(1 * time.Second) // 잠시 대기 cancel() // 고루틴 취소 time.Sleep(1 * time.Second) // 고루틴의 종료를 기다림 fmt.Println("메인 함수 종료") } ``` 위의 예제에서 `worker` 함수는 `context.Context`를 사용하여 작업을 수행합니다. 메인 함수에서 `cancel()`을 호출하면 고루틴이 취소되고, `ctx.Done()` 채널을 통해 이를 감지합니다. 결론 Go에서 고루틴의 종료를 감지하는 방법은 다양하며, 상황에 따라 적절한 방법을 선택할 수 있습니다. 채널을 사용한 방법은 간단하고 직관적이며, `sync.WaitGroup`은 여러 고루틴을 동시에 관리하는 데 유용합니다. `context` 패키지는 취소 및 타임아웃 기능을 제공하여 더 복잡한 작업 흐름을 관리하는 데 적합합니다. 이러한 방법들을 적절히 활용하여 고루틴의 종료를 효과적으로 감지하고 관리할 수 있습니다.
이용안내
커뮤니티 이용안내
×
- 게시한 게시글로 발생하는 문제는 게시자에게 책임이 있습니다.
- 게시글이 타인/타업체의 저작권을 침해할 경우 모든 책임은 게시자에게 있습니다. 게시자가 모든 손해를 부담해야 합니다.
- 상식닷컴 운영자는 게시자와 상의하지 않고 게시글을 수정 또는 삭제할 수 있습니다.
- 상식닷컴 운영자는 깨끗한 커뮤니티 공간을 만드는 것이 1순위입니다.
수정하기
취소하기