CafeM0ca

[Go] Goroutine과 channel 본문

Programming/Go

[Go] Goroutine과 channel

M0ca 2020. 12. 7. 20:18
반응형

tour.golang.org/concurrency/1

 

A Tour of Go

 

tour.golang.org

고루틴은 경량 스레드로 go runtime에 관리된다.

고루틴은 같은 주소 공간에서 동작하며 공유 메모리에서 반드시 싱크로되어 접근한다. 

 

위에가 고루틴 소스코드인데 go 키워드를 사용해서 함수를 호출하면 된다. 진짜 심플해서 좋은 것 같다.


Channel이라는 문법이 있는데, 채널은 데이터를 주고 받을 수 있는 통로다. 왼쪽 화살표가 채널의 연산자다.

맵과 슬라이스처럼 채널은 반드시 생성되면서 선언해줘야 한다.

기본적으로, 보내는 쪽과 받는 쪽은 다른쪽이 준비 될 때까지 block된다.

채널은 고루틴이 명시적으로 lock이나 condition variable(cafemocamoca.tistory.com/221)없이 동기화를 가능하게 해준다. (고루틴에서 자주 사용한다는 말)

 

예제를 보면 16번째줄에서 채널을 생성하고 sum함수를 2번 호출해서 s의 절반씩 계산한다.

10번째줄에서 sum의 결과를 채널 변수 c로 받고 19번쨰줄에서 그 결과를 바로 x,y에 집어넣어준다.


Buffered Channel은 이름 그대로 채널에 버퍼를 할당할 수 있다. 만들 땐 무조건 make로 만들어야 한다.

예제를 보면 6번째줄에서 ch는 버퍼가 2인 채널을 만들고 있다.

채널에 데이터를 1,2를 순서대로 집어넣고 있고 출력시 1과 2가 순서대로 출력된다.

보내는쪽은 buffered channel의 버퍼가 꽉 차야 block할 수 있다.

받는 쪽은 버퍼가 비어있어야 block한다.


range로 채널 접근과, select에 대한 내용을 썼는데 글이 날라가는 바람에 아래의 링크로 대체한다.

golang.site/go/article/22-Go-채널

 

예제로 배우는 Go 프로그래밍 - Go 채널

1. Go 채널 Go 채널은 그 채널을 통하여 데이타를 주고 받는 통로라 볼 수 있는데, 채널은 make() 함수를 통해 미리 생성되어야 하며, 채널 연산자 <- 을 통해 데이타를 보내고 받는다. 채널은 흔히 gor

golang.site

 

반응형
Comments