더북(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 프로그램에 필요한 기능
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.