如何将块分配给core.asyc中的线程

时间:2016-02-20 02:16:09

标签: clojure core.async

我一直在使用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方法?

2 个答案:

答案 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)))))))

相关问题