Tucker의 Go 언어 프로그래밍 Ch23 ~ Ch26
이 글은 골든래빗 《 Tucker의 Go언어 프로그래밍 》의 23장~26장 써머리입니다.
Ch23 ~ Ch26
- 에러 핸들링
- 고루틴과 동시성 프로그래밍
- 채널과 컨텍스트
- 단어 검색 프로그램 만들기
# 에러 핸들링
# 에러 타입
|
|
문자열을 반환하는 Error()
메서드를 구현하고 있다면 에러로 사용 가능
# 에러 생성
사용자 error 생성
|
|
에러 랩핑
- 에러를 감싸 새로운 에러 생성
|
|
# 패닉
프로그램 흐름을 중지시키는 기능 (강제 종료)
- 프로그램을 바로 종료시켜 빠르게 문제 발생 시점을 알 수 있음
- 콜 스택(함수 호출 순서)을 확인할 수 있음
|
|
recover()
프로그램이 종료되지 않게 패닉을 복구
- 발생한 panic 객체를 반환
|
|
# 고루틴
Go언어에서 관리하는 경량 스레드
- 함수나 명령을 동시에 실행할 때 사용
|
|
메인 루틴
main() 함수와 함께 시작되고 종료 (프로그램 또한 종료)
- main() 함수로 부터 생성된 서브 고루틴들도 main() 함수 종료시 즉시 종료
# WaitGroup
고루틴이 종료될 때까지 대기하기 위해 사용
|
|
# 동작 방법
OS 스레드를 이용하는 경량 스레드
- CPU 코어마다 OS 스레드를 하나만 할당해서 사용
- 남는 코어가 없을 때는 생길 때까지 고루틴들이 대기
- 스레드를 할당 받은 고루틴이 대기 상태(e.g. 네트워크 수신 대기)에 들어가면 대기 중인 고루틴들과 교체
장점
컨텍스트 스위칭 비용이 발생하지 않음 (CPU 코어가 스레드를 변경하지 않고 고루틴만 옮겨 다님)
# 동시성 프로그래밍
# 뮤텍스
상호 배제
- 자원 접근 권한을 통제
|
|
단점
- 동시성 프로그래밍으로 얻는 성능 향상을 얻을 수 없음 > - 오직 하나의 고루틴만 공유 자원에 접근 가능
- 데드락 발생 가능성이 생김 > - 데드락이 걸리지 않는지 확인하고 좁은 범위에서 사용
# 자원 관리 기법
고루틴들이 같은 자원에 접근하지 않도록 자원을 관리
- 영역을 나누는 방법
- e.g. 파일별로 고루틴 할당
- 역할을 나누는 방법
- 채널 사용
# 채널과 컨텍스트
# 채널
고루틴끼리 메시지를 전달할 수 있는 메시지 큐
인스턴스 생성
|
|
사용
|
|
# range 문
채널의 값을 모두 가져오고 닫혀있으면 탈출
|
|
# select문
|
|
- 여러 채널을 동시에 대기
- for 문과 함께 사용하여 종료하지 않고 계속해서 데이터 처리
- 고루틴 안에 사용하여 다른 작업을 하며 채널 대기
time 채널
- time.Tick(): 일정 시간 간격 주기로 신호를 보내주는 채널을 생성
- time.After(): 일정 시간 경과 후에 신호를 보내주는 채널을 생성
# 생산자 소비자 패턴
역할을 나누는 방법 (컨베이어 벨트 시스템)
고루틴(작업)들 사이에 채널을 두고 작업 결과를 채널로 넘겨줌
장점
다음 작업 시작시 모든 작업이 끝날때까지 기다리지 않고 본인 작업을 시작할 수 있음
# 컨텍스트
context 패키지에서 제공하는 기능으로 작업 명세서 역할을 함
작업 취소가 가능한 컨텍스트
|
|
작업 시간을 설정한 컨텍스트
|
|
특정 값을 설정한 컨텍스트
|
|
컨텍스트 랩핑
컨텍스트 생성시 이미 만들어진 컨텍스트 객체를 인자로 주어
컨텍스트 랩핑이 가능
# 단어 검색 프로그램 만들기
구조
코드
|
|