채널

채널 (Channels)

채널은 두 스레드를 동기화하면서 동시에 한쪽에서 다른 쪽으로 값을 전달하는 수단이에요. 스레드 사이의 메시지 전달에서 가장 기본적인 형태죠.

출처: Racket Reference

본문

11.2.2 채널

채널(channel)은 한 쌍의 스레드를 동기화하면서 동시에 한쪽에서 다른 쪽으로 값을 전달합니다. 채널은 동기적(synchronous)이에요. 즉 보내는 쪽과 받는 쪽 모두 (원자적인) 트랜잭션이 완료될 때까지 블록해야 합니다. 여러 보낸 쪽과 받는 쪽이 동시에 하나의 채널에 접근할 수 있지만, 각 트랜잭션에는 한 명의 보낸 쪽과 한 명의 받는 쪽이 선택됩니다.

채널 동기화는 공정(fair)합니다. 어떤 스레드가 채널에 블록되어 있고 그 채널의 트랜잭션 기회가 무한히 자주 발생한다면, 그 스레드는 결국 트랜잭션에 참여하게 됩니다.

채널 전용 프로시저와 함께 쓰는 것 외에도, 채널은 동기화 가능 이벤트(synchronizable event)로도 사용할 수 있어요 (이벤트 참고). channel-get이 블록되지 않을 때 채널은 동기화 준비가 된 상태입니다. 채널의 동기화 결과는 channel-get의 결과와 같아요.

버퍼드 비동기 채널에 대해서는 버퍼드 비동기 채널을 보세요.

channel?

(channel? v) → boolean?
  v : any/c

v가 채널이면 #t를, 그렇지 않으면 #f를 반환합니다.

make-channel

(make-channel) → channel?

새 채널을 만들어 반환합니다. 이 채널은 channel-get이나 channel-try-get과 함께 쓰거나, 값을 받기 위한 동기화 가능 이벤트(이벤트 참고)로 사용할 수 있어요. 또한 channel-put이나 channel-put-evt의 결과와 함께 쓰면 채널을 통해 값을 보낼 수 있습니다.

channel-get

(channel-get ch) → any
  ch : channel?

보낸 쪽이 ch를 통해 값을 제공할 준비가 될 때까지 블록합니다. 결과는 보내진 값입니다.

channel-try-get

(channel-try-get ch) → any
  ch : channel?

보낸 쪽이 즉시 준비되어 있다면 ch에서 값을 받아 반환하고, 그렇지 않으면 #f를 반환합니다.

channel-put

(channel-put ch v) → void?
  ch : channel?
  v : any/c

받는 쪽이 ch를 통해 값 v를 받아들일 준비가 될 때까지 블록합니다.

channel-put-evt

(channel-put-evt ch v) → channel-put-evt?
  ch : channel?
  v : any/c

sync와 함께 쓰기 위한 새 동기화 가능 이벤트를 반환합니다. (channel-put ch v)가 블록되지 않을 때 이 이벤트는 동기화 준비가 되며, 이벤트의 동기화 결과는 이벤트 자신입니다.

channel-put-evt?

(channel-put-evt? v) → boolean?
  v : any/c

vchannel-put-evt에 의해 만들어진 채널-put 이벤트이면 #t를, 그렇지 않으면 #f를 반환합니다.

더 알아보기