더북(TheBook)

5.4.3 파이프라인

유닉스에서는 셸 명령어를 파이프(|)로 연결할 수 있다. 파이프를 통해 셸 명령어를 실행하면 각 프로세스는 파이프로 연결되고 한 프로세스의 결과가 다른 프로세스의 입력으로 전달된다.

명령 프롬프트

$ find src | grep .go$ | xargs wc -l

이 명령은 src 디렉터리에 있는 파일 중에(find src), 파일 이름이 .go로 끝나는 파일을 필터링해서(grep .go$), 파일의 정보를 라인 수와 함께 출력한다.

Go의 기본 라이브러리 함수 io.Pipe()를 사용하면 유닉스 스타일로 파이프라인을 생성할 수 있다. io.Pipe()를 호출하면 *PipeReader*PipeWriter가 반환되는데, *PipeReader*PipeWriter는 내부적으로 서로 연결돼 있어서 *PipeWriter의 결과가 *PipeReader의 입력으로 바로 전달된다. 하지만 io.Pipe()*PipeReader*PipeWriter로만 연결되므로 다양하게 활용하기에는 제약이 있다.

이번 절에서는 채널을 통해 여러 고루틴을 파이프라인 형태로 연결하는 방법을 소개한다.

앞에서 예를 들어 설명한 셸 명령어(find src | grep .go$ | xargs wc -l) 같은 방식으로 동작하는 프로그램을 채널로 작성해 보자.

이 프로그램에 필요한 기능은 다음과 같다.

표 5-2 프로그램에 필요한 기능

기능

메서드

매개변수

반환 값

특정 디렉터리의 모든 파일 검색

find(path string) []string

path: 검색할 디렉터리

검색 결과

특정 문구를 포함하는

파일 필터링

grep(pattern string,

files []string) []string

pattern: 필터링할 파일 이름 패턴

files: 파일 목록

필터링 결과

필터링한 파일 정보 출력

display(files []string)

files: 파일 목록

 

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.