我一直在使用core.async(服务器端)并且有一个关于将线程分配给core.asyc go循环的问题。
如果我有以下go-block
(go (while true
(let [[v ch] (alts!! [@app/p4])]
(when (= :notify (:action v))
(do-notify v)))))
我看到这个和所有其他go块正在捆绑我称之为此功能的相同线程。
我试过这个:
(dotimes [i 10]
(.start (Thread.
(fn []
(go (while true
(let [[v ch] (alts!! [@app/p4])]
(when (= :notify (:action v))
(do-notify v)))))))))
虽然它“有效”但我觉得我不必要地占用线程而不利用频道的灵活性。什么是使用core.async限制按需启动线程的clojure方法?
答案 0 :(得分:3)
alts!!
阻止线程。在内部去块,你想使用alts!
,它将停放它(也就是说,释放它以便它可以运行其他去块)
答案 1 :(得分:1)
您的解决方案基本上是对的。它实际上是正确的,它几乎正是thread
宏的作用。
表达相同想法的更简单方法就是:
(dotimes [i 10]
(thread
(go (while true
(let [[v ch] (alts! [@app/p4])]
(when (= :notify (:action v))
(do-notify v)))))))