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

how to allocate go blocks to threads in core.asyc

我一直在使用 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)))))))))

虽然它 "works" 我觉得我不必要地占用线程并且没有利用渠道的灵活性。使用 core.async 限制按需旋转线程的 clojure 方法是什么?

alts!! 阻塞线程。在 go 块内,你想使用 alts!,它将停放它(也就是释放它,以便它可以 运行 其他 go 块)

您的解决方案基本上是正确的。事实上,它是如此正确,几乎正是 thread 宏所做的。

表达相同想法的更简单方法是: (dotimes [i 10] (thread (go (while true (let [[v ch] (alts! [@app/p4])] (when (= :notify (:action v)) (do-notify v)))))))