【问题标题】:Transducer on core.async channelscore.async 通道上的转换器
【发布时间】:2016-01-18 05:39:12
【问题描述】:

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

【问题讨论】:

  • 不可能都是真的吗? ClojureScript 中的任务切换只有一个线程,但它们都是同时执行的。
  • 真正取决于 core.async 它的作用。您可以阅读保证书。但我确信,如果您将拥有的通道数与计算机上的内核数相匹配,并且没有其他任何东西在运行,那么您可以一次在所有内核上获得最大的 CPU 使用率。这告诉我正在使用真正的线程(不是虚拟线程),每个通道一个,这就是你期望 core.async 在 Java 执行环境中尝试做的事情。然而,我认为“传感器”这个词与这个问题无关。

标签: clojure clojurescript core.async


【解决方案1】:

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

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

所以所有通道的传感器都将使用相同的线程

【讨论】:

    【解决方案2】:

    它们将并行执行,因此同时在不同的真实线程上执行。但是,您的机器可能没有 10 个内核,因此会有一些停车和阻塞。您可以在“停车和阻塞”部分查看技术细节here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-11
      • 1970-01-01
      • 2015-07-04
      • 1970-01-01
      • 2014-03-20
      相关资源
      最近更新 更多