Clojure 如何在core.async通道中执行传感器?

Clojure 如何在core.async通道中执行传感器?,clojure,clojurescript,core.async,Clojure,Clojurescript,Core.async,将频道设置为这样的频道时: (chan 10 tx) 如果我创建了10个这样的通道,然后同时向所有通道发送消息,那么传感器将如何执行。它们是并发运行还是在一个线程上运行?我认为目前还没有定义传感器运行时的行为,但从实现来看,传感器(即添加!字段)在从通道写入和读取时都可以调用 运行一个简单的测试似乎是,如果通道未满,写入线程将执行传感器,但如果通道已满,有时读取线程将运行传感器 带有小缓冲区的样本: (defn thread-name [] (.getName (Thread/curren

将频道设置为这样的频道时:

(chan 10 tx)

如果我创建了10个这样的通道,然后同时向所有通道发送消息,那么传感器将如何执行。它们是并发运行还是在一个线程上运行?

我认为目前还没有定义传感器运行时的行为,但从实现来看,传感器(即
添加!
字段)在从通道写入和读取时都可以调用

运行一个简单的测试似乎是,如果通道未满,写入线程将执行传感器,但如果通道已满,有时读取线程将运行传感器

带有小缓冲区的样本:

(defn thread-name []
  (.getName (Thread/currentThread)))

(require '[clojure.core.async :as async :refer [chan <! >! >!! go]])

(defn p [& args]
  (locking *out*
          (apply println (thread-name) ":" args)))

(defn log [v]
  (p "Transforming" v)
  v)

(def tx (map log))

(def c (chan 1 tx))
(def c2 (chan 1 tx))

(go
  (loop []
    (when-let [v (<! c)]
      (p "Getting from c1" v)
      (<! (async/timeout 100))
      (recur))))

(go
  (loop []
    (when-let [v (<! c2)]
      (p "Getting from c2" v)
      (<! (async/timeout 100))
      (recur))))

(dotimes [_ 5]
  (p "Putting in c1" 1)
  (>!! c 1)
  (p "Putting in c2" 100)
  (>!! c2 100))
(defn线程名称[]
(.getName(线程/当前线程)))
(需要“[clojure.core.async:as async:refere[chan!>!!go]]”)
(定义参数[&args]
(锁定**
(应用println(线程名称)“:“args)))
(定义日志[v]
(p“转变”v)
(五)
(def tx(地图日志))
(def c(chan 1 tx))
(def c2(chan 1 tx))
(去
(循环[]
(当让[v(!!c 1)
(p“输入c2”100)
(>!!c2 100))
生成输出:

nREPL-worker-20 : Transforming 1
nREPL-worker-20 : Putting in c2 100
async-dispatch-33 : Getting from c1 1
nREPL-worker-20 : Transforming 100
nREPL-worker-20 : Putting in c1 1
async-dispatch-31 : Getting from c2 100
nREPL-worker-20 : Transforming 1
nREPL-worker-20 : Putting in c2 100
nREPL-worker-20 : Transforming 100
nREPL-worker-20 : Putting in c1 1
async-dispatch-35 : Getting from c2 100
async-dispatch-34 : Transforming 1 <---- In this case is run in the reading side
async-dispatch-34 : Getting from c1 1
nREPL-worker-20 : Putting in c2 100
nREPL-worker-20 : Transforming 100
async-dispatch-37 : Getting from c2 100
async-dispatch-36 : Getting from c1 1
nREPL-worker-20 : Putting in c1 1
nREPL-worker-20:转换1
nREPL-worker-20:投入c2 100
async-dispatch-33:从c1 1获取
nREPL-worker-20:转型100
nREPL-worker-20:输入c1 1
async-dispatch-31:从c2 100获取
nREPL-worker-20:转型1
nREPL-worker-20:投入c2 100
nREPL-worker-20:转型100
nREPL-worker-20:输入c1 1
async-dispatch-35:从c2 100获取
async-dispatch-34:转换1