clojure - core.async channel 上的传感器

标签 clojure clojurescript core.async

如果我有 10 个缓冲订阅 channel ,每个 channel 都有一个需要 5 秒执行的传感器。传感器是并发执行还是全部在同一线程上执行(假设多线程上下文)?

最佳答案

很容易检查,记录线程,传感器正在执行:

(def log-chan (chan))

(go-loop []
  (println (<! log-chan))
  (recur))

(def channels
  (repeatedly
    10
    #(chan 10
       (map (fn [item]
              (let [thread (Thread/currentThread)]
                (go (>! log-chan thread)))
              item)))))

(doseq [c channels]
  (go (>! c :item)))

输出:

#object[java.lang.Thread 0x77a39fa0 Thread[async-dispatch-27,5,main]]
#object[java.lang.Thread 0x7d5bf4d0 Thread[async-dispatch-31,5,main]]
#object[java.lang.Thread 0x53ecb32b Thread[async-dispatch-29,5,main]]
#object[java.lang.Thread 0x2b74f3ac Thread[async-dispatch-25,5,main]]
#object[java.lang.Thread 0x6eb50f9e Thread[async-dispatch-26,5,main]]
#object[java.lang.Thread 0x30701edb Thread[async-dispatch-30,5,main]]
#object[java.lang.Thread 0x1a370b69 Thread[async-dispatch-36,5,main]]
#object[java.lang.Thread 0x3d9884a2 Thread[async-dispatch-24,5,main]]
#object[java.lang.Thread 0x208941d0 Thread[async-dispatch-23,5,main]]
#object[java.lang.Thread 0x2c77aeb Thread[async-dispatch-28,5,main]]

所以你可以看到,有不同的线程。

但它实际上取决于一个 go block ,您可以在其中将数据发送到您的 channel ,因此如果您更改此设置:

(doseq [c channels]
  (go (>! c :item)))

对此:

(go (doseq [c channels]
  (>! c :item)))

你得到这个输出:

#object[java.lang.Thread 0x16856295 Thread[async-dispatch-6,5,main]]
#object[java.lang.Thread 0x16856295 Thread[async-dispatch-6,5,main]]
#object[java.lang.Thread 0x16856295 Thread[async-dispatch-6,5,main]]
#object[java.lang.Thread 0x16856295 Thread[async-dispatch-6,5,main]]
#object[java.lang.Thread 0x16856295 Thread[async-dispatch-6,5,main]]
#object[java.lang.Thread 0x16856295 Thread[async-dispatch-6,5,main]]
#object[java.lang.Thread 0x16856295 Thread[async-dispatch-6,5,main]]
#object[java.lang.Thread 0x16856295 Thread[async-dispatch-6,5,main]]
#object[java.lang.Thread 0x16856295 Thread[async-dispatch-6,5,main]]
#object[java.lang.Thread 0x16856295 Thread[async-dispatch-6,5,main]]

因此所有 channel 的传感器将使用相同的线程

关于clojure - core.async channel 上的传感器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34847928/

相关文章:

clojure - 为什么每一个?函数在 Clojure 中用空向量返回 true?

clojure - cl 格式没有小数位(lisp 格式)

clojure - 我可以使用 http-kit 和 core.async 制作一个完全非阻塞的后端应用程序吗?

syntax - 有没有什么程序可以添加Clojure的括号?

audio - 我如何连接/展平字节数组

clojure - 带关键字参数的可变参数函数

loops - 如何将 Common Lisp 代码的循环部分翻译成 Clojure? ... 功能定位

clojurescript - 将不同的 React 版本与 clojurescript react 库一起使用(试剂、om、rum、quiescent)

macros - 当协议(protocol)调用表单包含 &lt;!宏(多方法 '-item-to-ssa' 无法在 :protocol-invoke) 上调度

asynchronous - 不再使用时是否应该关闭 clojure core.async channel ?