Clojure의 상태 기반 컴퓨터 구현 core.async를 Clojure의 스레드 기반 구현이 아닌 Clojure에서 사용할 수 있습니까? 스레드를 사용하지 않고 JVM에서 core.async를 사용할 수 있기를 원합니다.ClojureScript의 core.async 구현을 Clojure에서 사용할 수 있습니까?
답변
현재로서는 불가능하지만 단일 스레드 모델을 지원하기 위해 core.async를 수정하는 데 방해가되는 것은 없습니다. 모든 발송은 clojure.core.async.impl.dispatch/run
을 통해 처리됩니다. 다른 발송 방법의 일종을 사용하도록 해당 기능을 변경하면 모든 것이 제대로 작동합니다. core.async의 ClojureScript 버전에는 setTimeout (또는 더 빠른 다른 기능)을 사용하는 dispatch/run
의 다른 버전이 있습니다. 코드를 복사하고 VM에서 작동하도록 수정하면 변경 사항이 발생하지 않아야합니다.
내부적으로 접근하여 go
에 사용 된 스레드 풀을 단일 스레드 만 사용하는 것으로 바꾸지 않는 한 엄격하게 단일 스레드 방식으로 JVM에서 core.async를 사용할 방법이 없습니다 .
그러나 edbond가 그의 의견에서 지적한 것처럼 Clojure 버전의 core.async는 go
을 처리하기 위해 상태 시스템을 사용합니다. 그런 다음 이러한 상태 시스템은 크기가 프로세서 수의 두 배인 + 42 스레드 풀의 스레드에서 실행되므로 많은 실제 스레드를 사용하지 않고 수천 개의 go
을 시작할 수 있습니다.
또한 실제 스레드를 go
처럼 작동하는 thread
매크로를 제공하지만 시작 core.async JVM을, 플러스 자신의 싱글 뱅 대응과 같은 일을 두 번 쾅 작업의 모음 (<!!
, >!!
등) 만에 블로킹 방식. 당신이 그것들을 사용할 지 여부는 당신에게 달렸습니다. go
과 single-bang 계열의 작업을 고수하면 core.async는 위에서 언급 한 스레드 풀 제한을 초과하는 스레드를 실행하지 않습니다.
처음에는 '42'가 그 대답의 목적은 그렇지만 [코드] (https://github.com/clojure/core.async/blob/76b25bf91c670b0c3542ed9cb687ff29fb2183a7/src/main/clojure/clojure/core/async/impl/exec/threadpool)를 확인했습니다. .clj # L21) 진짜 농담 이었어. :-) – Shepmaster
- 1. core.async 블록에서 for 루프를 사용할 수 없습니까?
- 2. 사용할 인터페이스 구현을 전역으로 설정할 수 있습니까?
- 3. Clojurescript의 SVG
- 4. ClojureScript의 WebSQL?
- 5. Clojure에서 namespace clojure.data.zip.xml을 사용할 수 없습니다.
- 6. core.async/thread를 어떻게 죽입니까?
- 7. 어떻게 Clojure에서 매크로를 매핑 할 수 있습니까?
- 8. ClojureScript의 하위 문자열 색인
- 9. Clojure core.async and lamina
- 10. 스택 블러 알고리즘의 PHP 구현을 사용할 수 있습니까?
- 11. Maven Central에서 어떤 EL 2.2 구현을 사용할 수 있습니까?
- 12. 복사 생성자를 비공개로 설정하고 기본 구현을 계속 사용할 수 있습니까?
- 13. Probabilistic Matrix Factorization을위한 Lasagne의 Adam 구현을 사용할 수 있습니까?
- 14. Java에서 사용할 인터페이스의 구현을 어떻게 알 수 있습니까?
- 15. VxWorks에서 Opensource SSH 서버 구현을 사용할 수 있습니까?
- 16. OpenCV의 K-Means 구현을 임의의 객체와 함께 사용할 수 있습니까?
- 17. MS.Net 프레임 워크 4.0에서 SqlClient의 Mono 구현을 사용할 수 있습니까?
- 18. Clojure 용 성능 카운터 (core.async 사용)
- 19. X509TrustManager 구현을 사용할 수 없습니다. htmlunit
- 20. itemid 열을 userid로 바꾸면 사용자 기반 구현을 위해 항목 기반 Hadoop 구현을 사용할 수 있습니까?
- 21. Clojure에서 부호없는 비교가 있습니까?
- 22. Clojure에서 '또는'를 어떻게 적용 할 수 있습니까?
- 23. Clojure에서 자바 인터페이스를 정의 할 수 있습니까?
- 24. 어떻게 Clojure에서 예외를 throw 할 수 있습니까?
- 25. Clojure에서 Java 메소드를 재정의 할 수 있습니까?
- 26. Clojure에서 자바 리플렉션을 메모 할 수 있습니까?
- 27. 어떻게 Clojure에서 정수 오버플로를 해결할 수 있습니까?
- 28. Clojure에서 줄을 어떻게 끊을 수 있습니까?
- 29. 캐시 구현을 선택하거나 직접 구현할 수 있습니까?
- 30. ClojureScript의 HTML 문자열에서 요소 추출
(계속) clj에서도 상태 머신을 사용하여 구현됩니다. doc (go) 및 소스를 참조하십시오. https://github.com/clojure/core.async/blob/56ded53243e1ef32aec71715b1bfb2b85fdbdb6e/src/main/clojure/clojure/core/async.clj#L356 – edbond
당연히하지만 ClojureScript는 스레드 대신에 상태 시스템을 사용하지만 Clojure 구현에는 상태 시스템이 없습니다. – exupero
궁금합니다. 왜 스레드를 사용하지 않으려 고합니다? – Shepmaster