Я немного работал с core.async (на стороне сервера) и задал вопрос о распределении потоков в цикле core.asyc go.Как выделить блоки go для потоков в core.asyc
Если я имел следующий идти-блок
(go (while true
(let [[v ch] (alts!! [@app/p4])]
(when (= :notify (:action v))
(do-notify v)))))
Я вижу, что это и все остальные идут блоки привязывания ту же нить, что я называю эту функцию.
Я попытался это:
(dotimes [i 10]
(.start (Thread.
(fn []
(go (while true
(let [[v ch] (alts!! [@app/p4])]
(when (= :notify (:action v))
(do-notify v)))))))))
и в то время как он «работает» я чувствую, что я излишне связывая нити и не пользуясь гибкой природы каналов. Что такое clojure способ разворота потоков по требованию с пределом использования core.async?
Это на самом деле именно то, что делает core.async. У него есть Threadpool. Вы можете видеть те же потоки, так как вы не используете их достаточно. https://github.com/clojure/core.async/blob/master/src/main/clojure/clojure/core/async/impl/exec/threadpool.clj – ClojureMostly
, чтобы быть ясным, core.async не может и не может выделять потоки для этого кода, потому что он использует 'alts !!', который запускает поток, а не 'alts!', который позволяет повторно использовать повторное использование между блоками go. – noisesmith