首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >core.async通道换能器

core.async通道换能器
EN

Stack Overflow用户
提问于 2016-01-18 05:39:12
回答 2查看 532关注 0票数 2

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-01-18 08:18:17

这是相当容易的检查,记录线程,传感器正在执行:

代码语言:javascript
复制
(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)))

产出:

代码语言:javascript
复制
#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块,在该块中向您的通道发送数据,所以如果您更改了以下内容:

代码语言:javascript
复制
(doseq [c channels]
  (go (>! c :item)))

对此:

代码语言:javascript
复制
(go (doseq [c channels]
  (>! c :item)))

你可以得到这个输出:

代码语言:javascript
复制
#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]]

所以所有通道的换能器都会使用相同的线程

票数 5
EN

Stack Overflow用户

发布于 2016-01-18 07:18:14

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34847928

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档