Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 정보처리기사 실기 기출문제
- CKA 기출문제
- 기록으로 실력을 쌓자
- 티스토리챌린지
- Kubernetes
- 코틀린 코루틴의 정석
- kotlin
- PETERICA
- kotlin querydsl
- AI
- kotlin coroutine
- Java
- docker
- Spring
- 공부
- aws
- tucker의 go 언어 프로그래밍
- CloudWatch
- CKA
- golang
- mysql 튜닝
- 정보처리기사실기 기출문제
- APM
- 오블완
- Pinpoint
- minikube
- AWS EKS
- Elasticsearch
- Linux
- go
Archives
- Today
- Total
피터의 개발이야기
[GO] Tucker의 GO 언어 프로그래밍 - 23장 채널과 컨텍스트 본문
반응형
ㅁ 들어가며
ㅇ Tucker의 GO 언어 프로그래밍 책을 보고 정리한 글입니다.
ㅇ [GO] Tucker의 GO 언어 프로그래밍 - 목차
ㅇ Go 언어에서 채널(Channel)과 컨텍스트(Context)는 동시성 프로그래밍과 요청 관리에 필수적인 도구이다.
ㅁ 채널(Channel) 사용하기
ㅇ 채널은 고루틴 간의 데이터 통신 및 동기화를 위한 파이프 역할을 한다.
ㅇ 기본 사용법
- 생성:
make(chan 타입)
- 송신:
채널 <- 데이터
- 수신:
데이터 := <-채널
// 기본 예시
ch := make(chan string) // 생성
go func() { ch <- "Hello" }() // 송신: 채널 <- 데이터
msg := <-ch // 수신: 데이터 := <- 채널
fmt.Println(msg) // Hello
ㅁ 버퍼드 채널 vs 언버퍼드 채널
유형 | 특징 | 예제 |
언버퍼드 | 송신/수신이 즉시 동기화 |
ch := make(chan int)
|
버퍼드 | 지정된 크기까지 비동기적 전송 |
ch := make(chan int, 3)
|
ㅇ 버퍼 크기를 조정하면 버퍼를 두어 비동기 처리가 가능하다.
ㅁ 채널 닫기 및 검증
close(ch) // 채널 닫기
val, ok := <-ch // ok=false: 채널 닫힘 상태
ㅁ select 문 활용
ㅇ 여러 채널을 논블로킹으로 처리할 때 사용된다.(p492)
select {
case msg := <-ch1:
fmt.Println(msg)
case <-time.After(1 * time.Second):
fmt.Println("Timeout")
}
ㅁ컨텍스트(Context) 사용하기
컨텍스트는 작업을 지시할 때 작업 가능 시간, 작업 취소 등의 요청 범위(request-scoped) 데이터와 취소 신호를 관리합니다.(p499)
ㅁ 기본 생성
ctx := context.Background() // 기본 컨텍스트 생성
ctx = context.WithValue(ctx, "key", "value") // 값 추가
ㅁ 취소 신호 전달
ctx, cancel := context.WithCancel(context.Background())
go func() {
time.Sleep(2 * time.Second)
cancel() // 취소 신호 전송
}()
<-ctx.Done() // 취소 신호 수신 대기
ㅁ 타임아웃/데드라인 설정
ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
defer cancel()
// 3초 내 작업 완료되지 않으면 자동 취소
ㅁ 값 전달
ctx := context.WithValue(context.Background(), "userID", 123)
if userID := ctx.Value("userID"); userID != nil {
fmt.Println(userID) // 123
}
ㅁ HTTP 요청에서의 활용
func handler(w http.ResponseWriter, r *http.Request) {
ctx := r.Context()
select {
case <-ctx.Done():
fmt.Println("요청 취소됨")
case <-time.After(5 * time.Second):
fmt.Fprintln(w, "응답 완료")
}
}
ㅁ 채널 vs 컨텍스트 비교
기능 | 채널 | 컨텍스트 |
주목적 | 고루틴 간 데이터 통신 |
요청 생명주기 관리
|
취소 처리 | 직접 구현 필요 |
내장 취소 API 제공
|
값 전달 | 타입 제한 없음 |
interface{} 타입으로 제한
|
사용 시나리오 | 동시성 작업 조율 |
API 요청, DB 트랜잭션 관리
|
ㅁ 마무리
- 채널: 고루틴 간 안전한 데이터 교환에 사용.
select
로 다중 채널 처리 가능하다 - 컨텍스트: 요청의 타임아웃/취소 관리 및 메타데이터 전파에 특화. HTTP 서버 개발 시 필수이다.
- 조합 사용: 채널로 데이터 흐름 제어 + 컨텍스트로 시스템 전역 상태 관리가 이상적이다.
ㅁ 함께 보면 좋은 사이트
반응형
'Programming > GO' 카테고리의 다른 글
[GO] 인터페이스와 제네릭의 차이점은? (0) | 2025.03.28 |
---|---|
[GO] Tucker의 GO 언어 프로그래밍 - 24장 제네릭 프로그래밍 (0) | 2025.03.27 |
[GO] Tucker의 GO 언어 프로그래밍 - 22장 고루틴과 동시성 프로그래밍 (0) | 2025.03.25 |
[GO] Tucker의 GO 언어 프로그래밍 - 4장 연산자 (0) | 2025.03.23 |
[GO] Tucker의 GO 언어 프로그래밍 - 3장 fmt (0) | 2025.03.21 |
Comments