2016-06-01 2 views
2

내 상황에 따라 서로 다른 기능간에 동일한 채널이 공유되므로이 모든 기능이 완료되면 신호를 보낼 때 채널을 닫아야합니다. 이것은 내가 생각해내는 것입니다. 그러나 견인 채널을 처리해야하고 닫기를 사용하는 대신 특수 키워드를 보내야하기 때문에 이상적이지 않습니다! 기능. 이 일을하는 또 다른 방법이 있습니까? core.async의 일부 기능이 있나요?여러 번 닫아야하는 채널 만들기

(defn shared-chan [n] 
    (let [in (chan) 
     out (chan)] 
    (go-loop [n n] 
     (if (= n 0) 
     (do 
      (async/close! in) 
      (async/close! out)) 
     (let [in-msg (<! in)] 
      (if (not= :close in-msg) 
      (do 
       (>! out in-msg) 
       (recur n)) 
      (recur (dec n)))))) 
    [in out])) 

답변

2

merge 당신을 도울 수 있습니다. 해당 문서에 따르면,

merge 소스 채널의 컬렉션을 가져 와서 그들로부터받는 모든 값이 포함 된 채널을 돌려줍니다. ... 모든 소스 채널이 닫힌 후에 채널 이 닫힙니다.

기본적으로 각 기능에 대한 채널을 만들고 merge을 하나씩 만들어야합니다.

0

take 변환기를 사용하여이 공유 채널을 생성 할 수 있습니다. 예를 들어, 당신은 3 개 항목에 대한 자동 폐쇄 채널하려는 경우 : (false는 쓰기 시도 후 반환으로) 채널이 즉시 트랜스 듀서가 모두 소모로 폐쇄 된 것으로,

user> (require '[clojure.core.async :as a]) 
nil 

user> (def shared-ch (a/chan 3 (take 3))) 
#'user/shared-ch 

user> (a/go-loop [] 
     (when-let [val (a/<! shared-ch)] 
      (println :reading val) 
      (recur))) 

#object[clojure.core.async.impl.channels.ManyToManyChannel 0x6bb1dee5 "[email protected]"] 

user> (a/>!! shared-ch 1) 
true:reading 1 

user> (a/>!! shared-ch 2) 
true:reading 2 

user> (a/>!! shared-ch 3) 
true:reading 3 

user> (a/>!! shared-ch 4) 
false 

user> (a/>!! shared-ch 5) 
false 

는 당신이 볼 수

관련 문제