티스토리 뷰

반응형

파이프 이미지

  유닉스의 명령어에는 파이프(기호: | )가 있다. 파이프를 사용하여 쉘 명령어를 연결하면, 프로세스의 결과를 다른 프로세스에 전달하는 것이 가능하다.

 

  Go의 기본 라이브러리로 io.Pipe()가 제공된다. io.Pipe()는 *PipeReader과 *PipeWriter을 리턴하고 이를 사용하여 유닉스 스타일로 파이프 라인을 생성할 수 있다. *PipeWriter과 *PipeReader은 서로 연결되어 바로 결과가 전달된다. 파이프는 구조화 되지 않는 바이트 스트림이다. 따라서 파이프를 사용하면 데이터의 포맷을 선택하고 직렬화 및 역직렬화를 거쳐야하기 때문에 더 많은 가능성이 발생할 위험이 있다.

 

  채널은 Go의 스트림이기 때문에 포맷이 정해져 있고 직렬화도 손쉽기 때문에 더 단순하다.

 

 

  아래는 파이프라인을 채널로 구현한 코드의 예시이다.

doLast의 함수 시그니처

  main 함수이다. doLast()는 채널을 리턴하는 함수이다. done 채널은 수신만 가능한 채널이다.

  반복문을 통해서 done 채널에 데이터가 전송되는 동안 받은 데이터 값을 출력한다.

 

prepare 함수

  prepare 메서드이다. 이 채널도 수신만 가능한 채널을 리턴한다. out 채널에 JOB_COUNT 횟수만큼 데이터를 전송을 한다. 그리고 전송이 끝난뒤 out 채널을 종료한다.

  순서는 아래와 같다.

1. out 채널 생성

2. 고루틴으로 out 채널에 데이터를 전송

3. 리턴 받은 out 채널로 전송된 데이터를 받음

4. 고루틴에서 데이터가 모두 전송이 되었다면 out 채널을 닫음

 

doFirst 함수

  함수 doFirst는 수신만 가능한 채널을 받고 수신만 가능한 채널을 리턴하는 함수이다. 여기서 doFirst도 고루틴을 실행한다. main에서 prepare, doFirst, doSecond, doThird, doLast 함수 모두 고루틴을 실행하는 함수이다. 함수는 고루틴 실행 + 데이터 전송을 위한 채널을 만드는 역할을 한다.

 

  이렇게 고루틴들이 파라미터로 받은 채널을 통해서 파라미터로 받은 함수가 실행한 고루틴 작업이 채널을 통해서 작업을 보내주는 것을 기다리고, 채널을 통해서 데이터를 받고 난 뒤에 자기의 작업을 실행하는 것을 확인할 수 있다.

 

  main에서는 함수들이 중첩되어서 실행되는데 이 구조는 앞의 작업이 끝났다는 것을 알려주기 위한 채널을 전달하는 것이다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
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
글 보관함