2016-02-20 2 views
1

Я немного работал с 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?

+1

Это на самом деле именно то, что делает core.async. У него есть Threadpool. Вы можете видеть те же потоки, так как вы не используете их достаточно. https://github.com/clojure/core.async/blob/master/src/main/clojure/clojure/core/async/impl/exec/threadpool.clj – ClojureMostly

+1

, чтобы быть ясным, core.async не может и не может выделять потоки для этого кода, потому что он использует 'alts !!', который запускает поток, а не 'alts!', который позволяет повторно использовать повторное использование между блоками go. – noisesmith

ответ

3

alts!! блокирует резьбу. Внутри ходовых блоков вы хотите использовать alts!, который будет припарковать его (ака, бесплатно, чтобы он мог запускать другие блоки захода)

1

Ваше решение в основном правильное. На самом деле так правильно, что это почти то, что делает макрос thread.

простой способ выразить ту же мысль была бы просто: (dotimes [i 10] (thread (go (while true (let [[v ch] (alts! [@app/p4])] (when (= :notify (:action v)) (do-notify v)))))))