본문 바로가기

goroutine7

[Go] 고루틴(GoRoutine) 심화(7) - 파이프라인 유래 파이프라인은 한 곳에서 다른 곳으로 액체를 옮기기 위해 사용한 파이프들의 집합을 말한다. 컴퓨터에서 말하는 파이프라인 역시 이와 마찬가지로 어떤 위치에서 다른 위치로 데이터를 처리 후 운반하기에 이와 같은 용어를 사용하는 것으로 보인다. 파이프라인이란? 시스템에서 추상화를 구성하는 데 사용할 수 있는 도구이다. 특히 Stream이나 Batch 작업들을 처리해야 할 때에는 특히 탁월한 효과를 낸다. 각 단계의 관심사를 분리할 수 있다. 그로써 다양한 이점을 얻을 수 있다. 1. 상호 독립적으로 단계를 수정할 수 있다. 2. 단계들의 결합 방식을 짜맞출 수 있다. 3. 일부분을 팬 아웃하거나 속도를 제한할 수 있다. 파이프라인의 특성 1. 각 단계는 동일한 타입을 소비하고 리턴한다. 2. 각 단계에서 .. 2022. 6. 24.
[Go] 고루틴(GoRoutine) 심화(6) - 고루틴 에러 처리 아무리 잘 짜여진 코드에서도 에러는 발생하기 마련이다. 그 원인이 내부적인 문제가 아니라 외부 환경에 의한 문제일 수 도 있고 아직 내가 겪어보지 못한 다양한 이유가 존재할 수 있다. 그렇기에 안정적인 서비스를 위해선 효율적인 에러 처리가 필수적이다. 그리고 Go라는 언어는 다른 언어에서 채용하는 에러 처리방법인 예외 모델을 사용하지 않고 더욱 직접적으로 에러를 다루는 형식을 채용한다. 그렇기에 다른 프로그래밍 언어에 비해 귀찮지만 조금 더 효율적이고 직관적인 에러 처리를 할 수 있다. 그렇다면 동시성 프로그래밍을 적용한 작업에선 어떤식으로 처리하는 것이 좋을까? 에러 처리에서 중요한 것 에러 처리를 함에 있어서 가장 중요한 것은 에러를 처리하는 주체이다. 동시에 프로세스가 병렬적으로 진행되는 동시성 프.. 2022. 6. 20.
[Go] 고루틴(GoRoutine) 심화(4) - channel Channel Channel 이란? 고루틴을 사용하는 데 있어서 데이터를 전달하는 가장 효과적인 방법이다. 데이터를 전달하는데 통로 역할을 한다. 채널을 사용하는 데 있어 서로 간에 많은 정보를 알 필요는 없으며 채널에 대한 주소 값만 알면 채널을 통해 데이터를 송신하고 수신할 수 있다. Channel의 종류 양방향 채널 (chan interface{}) 데이터를 송신하고 수신하는 역할 모두 가능하다. 송신용 채널 (chan 2022. 5. 15.
[Go] 고루틴(GoRoutine) 심화(2) - 클로저 함수, 메모리 클로저 함수를 통해 고루틴을 생성한다면 어떤 일이 생길까? 그리고 이 부분에서 무엇을 배울 수 있을까? 책에서는 짧게 설명하고 넘어가는 부분이다. 하지만 나는 쉽게 이해할 수 없었고 그 이유를 찾기 위해 노력했다. 그리고 그 이유는 Go 언어가 메모리를 어떻게 사용하는지 모르기 때문인 것을 알 수 있었다. 그렇기에 이번 포스팅에서는 클로저 함수를 통해 고루틴을 생성하는 것에 대한 예제와 결과를 통해 Go에서 메모리를 어떻게 사용하는지 까지 정리해 보려 한다. 우선 짧은 예제를 살펴보자. 예제 코드 package main import ( "fmt" "sync" ) func main() { var wg sync.WaitGroup val := "memory 1" wg.Add(1) go func() { defe.. 2022. 4. 28.
[Go] 고루틴(GoRoutine) 심화(1) - 합류지점 최근 고루틴에 대해 깊이 이해하고 사용하고 싶은 욕심이 있어 캐서린 콕스 부데이가 짓고 O'Reilly에서 출판한 Concurrency in Go 책을 읽으며 공부하고 있다. 하지만 어느 정도 용어에 대한 지식이 필요한 듯해 보이고 나는 아직은 그 정도 내공을 갖추지 못한 듯하다. 그렇기에 이렇게 블로그에 기록하며 공부하려 한다. 기존의 게시물에서는 고루틴을 사용하는 방법을 알아봤다면 이 게시물에서는 보다 풍부하게 사용하기 위한 원리를 함께 알아보고자 한다. 고루틴 간단한 고루틴을 사용하는 예시 코드를 보겠다. 코드 package main import ( "fmt" ) func main() { go sayHello() } func sayHello() { fmt.Println("hello") } 결과 고루.. 2022. 4. 16.
[Go] 고루틴(Goroutine) 알고쓰기(2) - Block 처리방식, Channel 동시성과 병행성의 차이 그리고 고루틴의 간단한 사용법을 이전 포스팅에 남겼다. 이 포스팅은 조금 더 고루틴을 맛깔나게 쓰기위한 Channel에 대해 알아보려 한다. ( 고루틴의 간단한 사용법은 이전 포스팅 글에서 확인하시길 바란다. ) Channel이란? Channel은 Golang의 고루틴 간의 통신을 위한 수단. Channel은 Thread Safe한 Queue이다. Channel은 Golang에서 기본 자료형으로 주어지며 일급 객체의 역할을 한다. Channel의 표기법은 chan [자료형]이며 주고 받는 역할을 하는 양방향 channel, 주기만 또는 받기만 하는 단방향 channel을 지정할 수 있다. Channel은 레퍼런스 자료형이다. Channel은 Block 형태의 처리방식을 가진다. B.. 2021. 9. 17.