본문 바로가기
IT

Golang 고루틴(Goroutine), 채널(Channel)

by 결국 그렇고 그런이야기 2022. 5. 23.
반응형


Go lang으로 개발한지 그래도 2년가까이 되어가는데
아직도 너무도 모르는 것이 많아서
Golang 하면 바로 떠오르는 goroutine에 대해서 좀 살펴보려고 했다.

먼저 고루틴(Goroutine)
막 거창하게 고루틴 생각할 수도 있는데 사실 심플하다.
한 번에 여러 개 작업을 동시에 실행하기 위한 것이 고루틴.

그리고 채널(Channel)
고루틴은 보통 비동기 통신인데 이 비동기를 순차적으로 실행할 수 있도록 해 주는 장치?

Head First Go에 따르면,
고루틴간의 데이터를 동기화하여 한 고루틴이 다른 고루틴보다 앞서가지 않도록 제어해주는 역할을
채널이 한다고 한다.

이렇게 고루틴(Goroutine)과 채널(Channel)을 이해했다.
혹시나 잘못된 정보라면, 댓글로 알려주시길.


Vender source까지 들어가야 이론적인 부분을 확인할 수 있는데.
아직 실무에서 goroutine, 채널 개념을 완전히 이해하고 사용하는 소스 코드 예는 보지 못함.

기본적으로 Go 루틴간 전화 시기와 전환 기간에 대해서는 아무것도 보장하지 않는다.
비동기 통신의 특성이지.
*Head first Go에 나오는 내용이다. 직접 써봐도 그렇고
근데 고루틴(Goroutine) 실패하는 케이스는 거의 본 적이 없다.
아직까지는.

채널로 구조체를 전달하기 시작하면 이 내용이 완전히 달라진다.
goroutine안에서도 동기화가 이루어진다.
예를 들면 아래와 같은 소스. (transport.go)
golang에서 vendor소스는 pkg 개념이라고 보면 편하려나? 암튼.

보자 마자 바로 이해가 가는 채널로 고루틴을 활용하는 사례.
이러면 순차적으로 read, write가 된다.
순서가 섞이지도 않고.

pconn.br = bufio.NewReaderSize(pconn, t.readBufferSize())
pconn.bw = bufio.NewWriterSize(persistConnWriter{pconn}, t.writeBufferSize())

go pconn.readLoop()
go pconn.writeLoop()
return pconn, nil


사실 goroutine은 심플한 이론인데 (그렇게 믿고 싶음)
goroutine과 채널의 관계는 조금 어렵다.
하지만 제대로 쓰려면 명확히 이해를 해야 사용할 수 있는데.
일단은 쓴거 보는 정도로만.
보고 이해하는 정도로만.

반응형

댓글