이번 챕터에서는 go의 패키지중에 context에 대해서 알아 봅니다.

https://golang.org/pkg/context/

 

context - The Go Programming Language

Package context

 사이트를 번역해서 공부합니다. 

 Package context는 API와 프로세스 사이에서 carries deadlines, 취소 signals, request-scoped 값들을

 전달하는 Context 타입을 정의합니다. 

 (request-scoped : 요청의 기간에만 생명주기를 가지는 값)

 서버에 들어오는 요청은 Context를 생성해야 하고 나가는 호출은 Context에 승인을 받아야 합니다.

 그들사이의 연속된(chain method) 함수 호출은 Context에 알려야 하며

 WithCancel, WithDeadLine, WithTimeout, WithValue와 같은 파생된 Context를 사용해서 대체 할 수도 있습니다.

 Context가 취소 될 때 해당 컨텍스트에서 파생된 모든 컨텍스트로 취소됩니다. 

 WithCancel, WithDeadLine, WithTimeout함수는 Context(부모)인자을 받으면 상속된

 Context(자식)과 CancelFunc 반환합니다.

 CancelFunc를 호출하면 자식Context와 그 하위 Context들을 취소하고 자식에 대한 부모의 참조를

 제거하고 연관된 타이머를 중지합니다. 

 CancelFunc 함수를 호출하지 않으면 부모가 취소되거나 타이머가 완료 될 때까지 자식과 그 하위 Context들이

 leak 됩니다.

 go vet tool은 CancelFunc가 모든 제어 흐름 경로에서 사용되는지 확인합니다.

 Context를 사용하는 프로그램은 package간의 인터페이스의 일관성을 유지하고 정적 분석 도구가 컨텍스트

 전파를 점검 할 수 있도록 규칙을 지켜야합니다.

 구조체 타입 안에 컨텍스트를 저장하지 마십시오 대신에 필요한 함수에 Context를 명시적으로 전달하세요

 Context는 첫번째 매개 변수여야 하며 이름은 일반적으로 ctx :

func DoSomething(ctx context.Context, arg Arg) error {
	// ... use ctx ...
}

 함수가 허용하더라도 nil Context를 전달하지 마세요. 사용할 Context에 대해서 확실 하지 않다면 TODO를 통해서

 전달하세요. 프로세스들과 API로 전달하는 request-scoped 데이터만 Context 값으로 사용하세요

 선택적 매개 변수를 함수에 전달하지 않습니다. 

 다른 goroutines안에서 수행중인 함수들에게 동일한 Context는 전달 될 수 있습니다.

 Context는 여러개의 goroutine이 동시에 사용에 대해서 안전합니다

+ Recent posts