2014-02-12 64 views
4

是否可以在Clojure中使用ClojureScript的基於狀態機的core.async實現,而不是Clojure的基於線程的實現?我希望能夠在JVM上使用core.async,但不使用線程。Clojure中可以使用ClojureScript的core.async實現嗎?

+0

(go)在clj中也使用狀態機實現。請參閱doc(去)和來源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版本有dispatch/run的不同版本,它使用setTimeout(或其他可能更快的事情)。複製該代碼,並將其修改爲適用於您的虛擬機,並且不應該那麼難。

7

沒有辦法以嚴格的單線程方式在JVM上使用core.async,除非您願意進入內部並將用於go的線程池替換爲僅使用單線程的線程池。

但是,正如edbond在他的評論中指出的那樣,core.async的Clojure版本確實使用狀態機來處理go。然後,這些狀態機運行於線程池中的線程上,線程池的大小限制爲處理器數量的兩倍+ 42,因此可以在不使用盡可能多的實際線程的情況下啓動數千個go

的JVM core.async還提供了一個thread宏,就像go,但真正啓動線程,加上雙響操作(>!!<!!等)工作,像他們的單爆炸同行的集合,但在阻擋時尚。你是否使用它取決於你;如果您堅持使用go以及單一操作系列操作,core.async將永遠不會啓動超出上述線程池限制的任何線程。

+2

起初,我以爲'42'是一個可愛的笑話答案的目的,但後來我檢查了[代碼](https://github.com/clojure/core.async/blob/76b25bf91c670b0c3542ed9cb687ff29fb2183a7/src/main/clojure/clojure/core/async/impl/exec/threadpool .clj#L21),看到它真的是一個可愛的笑話。 :-) – Shepmaster

相關問題