2016-06-02 8 views
3

일부 프로세스에 관련된 core.async/thread에 의해 반환 된 일부 스레드가 있는데이 스레드는 종료하려고합니다. 나는 전체 프로그램을 종료하지 않고이 스레드 만 종료합니다. 어떻게 스레드를 종료 할 수 있습니까?core.async/thread를 어떻게 죽입니까?

user=> (clojure.core.async/thread) 
#object[clojure.core.async.impl.channels.ManyToManyChannel 0x780e97c0 
    "[email protected]"] 
user=> (type *1) 
clojure.core.async.impl.channels.ManyToManyChannel 

내가 어떤 문서를 발견하지 않았습니다 : 자바 Thread 클래스의 .stop 방법은 사용되지 않습니다하지만 난 Thread하지 그 core.async/thread 반환을 제외하고, 그것을 사용 드리겠습니다,하지만 ManyToManyChannel

ManyToManyChannel에 있습니다. 스레드의 유형에 이상한 이름처럼 들리므로 여기 이해할 수없는 기본 요소가있을 수 있습니다. 그러나 현재 나의 순진한, 무의미하게 들리는 질문이 있습니다 : 어떻게 ManyToManyChannel을 죽입니까?

clojure.repl/thread-stopperManyToManyChannel에 영향을 미치지 않는 것으로 보입니다.

답변

3

스레드가 자연스럽게 종료되도록합니다. 외부 종료가 필요한 경우이를 구현해야합니다.

(defn terminatable [input-ch terminate-ch] 
    (thread 
    (loop [] 
     (let [[v ch] (alts!! [input-ch terminate-ch])] 
     (if (identical? ch input-ch) 
      (if (some? v) 
      (do (process-input v) (recur)) 
      ;; else input-ch has closed -> don't call recur, 
      ;; thread terminates 
      ) 
      ;; else we received sth. from terminate-ch, 
      ;; or terminate-ch has closed -> don't call recur, 
      ;; thread terminates 
      ))))) 

그리고 마지막으로 당신이 스레드가 thread에 의해 반환 된 채널에서 복용에 의해 종료 될 때 확인할 수 있습니다 (close! terminate-ch)

를 통해 외부 적으로 종료합니다.

I. e.

+0

이렇게하면 이런 코드를 작성할 수 없습니까? '(즉,'alts !! '대신에'line-seq'를 한줄 씩 호출하는 것입니다.)'(async/thread (doseq [line-seq subprocess-stdout]) (> !! stdout-) 그렇지 않다면'line-seq'를 호출하여 서브 프로세스의 모든 것을 읽는 편리함과 같은 것을 얻을 수있는 방법이 있는가? 서브 프로세스가 종료 될 때까지 기다리지 않고 이것을 종료하는 쉬운 방법이 있는가? –

+0

이것은이다. 스트림 프로세싱의 포인트 : 채널로 모델 스트림을 모델링합니다. 따라서 예제에서 input-ch와 같이 채널에 라인을 넣고 한 번에 한 라인 씩 가져와야합니다. -chan input-ch (line-seq subprocess-stdout))'.'v'는 라인이되고,'process-input'의 구현 내에서'stdout-chan '에 넣는 것처럼 처리 할 수 ​​있습니다. –

+0

트랜스 듀서뿐만 아니라'pipeline-blocking '과'pipeline-async'에 대한 투자를 고려하십시오. 이는 스트림의 처리를 병렬화하는 간단한 도구를 제공하기 때문입니다. 대체 종료 전략 (대상 채널 폐쇄)을 수행합니다. –