简体   繁体   English

核心异步通道上的换能器

[英]Transducer on core.async channels

If i have 10 buffered subscription channels each with a transducer that takes 5sec to execute. 如果我有10个缓冲的订阅频道,每个频道都有一个换能器,则需要5秒才能执行。 Are the transducers going to be executed concurrent or all on the same thread (assuming multithreaded context)? 换能器是要同时执行还是全部在同一线程上执行(假定多线程上下文)?

it is quite easy to check, logging the thread, the transducer is being executed by: 这很容易检查,记录线程,通过以下方式执行换能器:

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

output: 输出:

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

so you can see, there are different threads. 因此您可以看到,有不同的线程。

But it really depends on a go block, inside which you send data to your channel, so if you change this: 但这实际上取决于go块,您可以在其中向通道发送数据,因此,如果更改此代码:

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

to this: 对此:

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

you get this output: 您得到以下输出:

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

so all channels' transducers would use the same thread 因此所有通道的换能器将使用相同的螺纹

They will be executed in parallel, so on different real threads at the same time. 它们将并行执行,因此可以同时在不同的实际线程上执行。 Your machine might not have 10 cores however, so there will be some parking and blocking. 但是,您的计算机可能没有10个核心,因此会有一些停车和阻塞。 You can look up the technical details here in the section 'Parking and Blocking'. 你可以看一下技术细节在这里一节“停车场和屏蔽”。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM