core.async频道上的传感器

时间:2016-01-18 05:39:13

标签: clojure clojurescript core.async

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

2 个答案:

答案 0 :(得分: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块,您可以在其中向您的频道发送数据,因此如果您更改此内容:

(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]]

所以所有频道&#39;换能器将使用相同的线程

答案 1 :(得分:1)

它们将并行执行,因此同时在不同的实际线程上执行。您的机器可能没有10个核心,因此会有一些停车和阻塞。您可以在“停车和阻止”部分中查找技术详细信息here