티스토리 뷰

프로그래밍 언어/Golang

goroutine

투자유v 2022. 2. 16. 16:13
728x90

goroutine

Go 런타임에 의해 관리되는 논리적 lightweight thread 입니다.
시간이 걸리는 작업을 메인 쓰레드와는 별도의 쓰레드에서 실행되도록 합니다.

예를들어, 티켓 예약 시스템에서 예약자의 정보를 입력받고 예약하는 과정은 메인 쓰레드에서 진행됩니다.
예약이 완료되고 이메일을 전송하는 작업(시간이 걸리는 작업)은 별도의 쓰레드에서 동작시킬 수 있습니다.
시간이 걸리는 작업을 처리하기 위해 메인 쓰레드가 대기하느라 다음 예약을 받을 수 없는 것을 방지하기 위함입니다.
작업 앞에 go 키워드만 붙여주면 됩니다.

func main() {
    ...
    go sendTicket(User{...})
    ...
}

기본적으로 goroutine 완료 보장 안함

위 코드는 sendTicket()이 실행되는 goroutine의 작업이 끝날 때까지 메인 쓰레드가 기다려주지 않습니다.
메인 쓰레드의 작업이 끝나면 sendTicket()이 실행되는 도중이라도 프로세스가 종료됩니다.

Waitgroup: goroutine 완료 보장

Waitgroup을 설정해서 메인 쓰레드 로직이 완료되더라도 대기하도록 하여 goroutine의 완료를 보장하도록 할 수 있습니다.

Add: 기다려야 할 goroutine 개수를 설정합니다.
Wait: main() 종료 전에 대기를 걸어서 설정한 goroutine 이 모두 종료될 때까지 기다립니다.
Done: goroutine이 종료되면 Waitgroup에 설정된 goroutine 개수를 감소시킵니다.

var wg = sync.WaitGroup{}

func main() {
    ...
    wg.Add(1) // 기다려야 할 goroutine이 1개니까 파라미터가 1
    go sendTicket(User{...})
    ...
    wg.Wait()
}
func sendTicket(user User) {
    ...
    wg.Done()
}
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함