2014-02-12 3 views
4

Clojure의 상태 기반 컴퓨터 구현 core.async를 Clojure의 스레드 기반 구현이 아닌 Clojure에서 사용할 수 있습니까? 스레드를 사용하지 않고 JVM에서 core.async를 사용할 수 있기를 원합니다.ClojureScript의 core.async 구현을 Clojure에서 사용할 수 있습니까?

+0

(계속) clj에서도 상태 머신을 사용하여 구현됩니다. doc (go) 및 소스를 참조하십시오. https://github.com/clojure/core.async/blob/56ded53243e1ef32aec71715b1bfb2b85fdbdb6e/src/main/clojure/clojure/core/async.clj#L356 – edbond

+0

당연히하지만 ClojureScript는 스레드 대신에 상태 시스템을 사용하지만 Clojure 구현에는 상태 시스템이 없습니다. – exupero

+0

궁금합니다. 왜 스레드를 사용하지 않으려 고합니다? – Shepmaster

답변

3

현재로서는 불가능하지만 단일 스레드 모델을 지원하기 위해 core.async를 수정하는 데 방해가되는 것은 없습니다. 모든 발송은 clojure.core.async.impl.dispatch/run을 통해 처리됩니다. 다른 발송 방법의 일종을 사용하도록 해당 기능을 변경하면 모든 것이 제대로 작동합니다. core.async의 ClojureScript 버전에는 setTimeout (또는 더 빠른 다른 기능)을 사용하는 dispatch/run의 다른 버전이 있습니다. 코드를 복사하고 VM에서 작동하도록 수정하면 변경 사항이 발생하지 않아야합니다.

7

내부적으로 접근하여 go에 사용 된 스레드 풀을 단일 스레드 만 사용하는 것으로 바꾸지 않는 한 엄격하게 단일 스레드 방식으로 JVM에서 core.async를 사용할 방법이 없습니다 .

그러나 edbond가 그의 의견에서 지적한 것처럼 Clojure 버전의 core.async는 go을 처리하기 위해 상태 시스템을 사용합니다. 그런 다음 이러한 상태 시스템은 크기가 프로세서 수의 두 배인 + 42 스레드 풀의 스레드에서 실행되므로 많은 실제 스레드를 사용하지 않고 수천 개의 go을 시작할 수 있습니다.

또한 실제 스레드를 go처럼 작동하는 thread 매크로를 제공하지만 시작 core.async JVM을, 플러스 자신의 싱글 뱅 대응과 같은 일을 두 번 쾅 작업의 모음 (<!!, >!! 등) 만에 블로킹 방식. 당신이 그것들을 사용할 지 여부는 당신에게 달렸습니다. go과 single-bang 계열의 작업을 고수하면 core.async는 위에서 언급 한 스레드 풀 제한을 초과하는 스레드를 실행하지 않습니다.

+2

처음에는 '42'가 그 대답의 목적은 그렇지만 [코드] (https://github.com/clojure/core.async/blob/76b25bf91c670b0c3542ed9cb687ff29fb2183a7/src/main/clojure/clojure/core/async/impl/exec/threadpool)를 확인했습니다. .clj # L21) 진짜 농담 이었어. :-) – Shepmaster

관련 문제