일부 프로세스에 관련된 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-stopper
은 ManyToManyChannel
에 영향을 미치지 않는 것으로 보입니다.
이렇게하면 이런 코드를 작성할 수 없습니까? '(즉,'alts !! '대신에'line-seq'를 한줄 씩 호출하는 것입니다.)'(async/thread (doseq [line-seq subprocess-stdout]) (> !! stdout-) 그렇지 않다면'line-seq'를 호출하여 서브 프로세스의 모든 것을 읽는 편리함과 같은 것을 얻을 수있는 방법이 있는가? 서브 프로세스가 종료 될 때까지 기다리지 않고 이것을 종료하는 쉬운 방법이 있는가? –
이것은이다. 스트림 프로세싱의 포인트 : 채널로 모델 스트림을 모델링합니다. 따라서 예제에서 input-ch와 같이 채널에 라인을 넣고 한 번에 한 라인 씩 가져와야합니다. -chan input-ch (line-seq subprocess-stdout))'.'v'는 라인이되고,'process-input'의 구현 내에서'stdout-chan '에 넣는 것처럼 처리 할 수 있습니다. –
트랜스 듀서뿐만 아니라'pipeline-blocking '과'pipeline-async'에 대한 투자를 고려하십시오. 이는 스트림의 처리를 병렬화하는 간단한 도구를 제공하기 때문입니다. 대체 종료 전략 (대상 채널 폐쇄)을 수행합니다. –