我有两个单向core.async频道:
put!take!的通道由于这是ClojureScript,所以阻塞操作不可用。我想做一个双向(输入和输出)通道从这两个(进出)。
(def in (async/chan))
(def out (async/chan))
(def in-out (io-chan in out)) ;; io or whatever the solution is
(async/put! in "test")
(async/take! ch (fn [x] (println x))) ;; should print "test"
(async/put! ch) ;; put into ch is equivalent to putting into `out`我尝试了以下一些方法(不起作用):
(defn io-chan [in-ch out-ch]
(let [io (chan)]
(go-loop []
(>! out-ch (<! io ))
(>! io (<! in-ch))
(recur))
io))架构可能会有帮助:
out in-out
---------------> (unused)
<--------------- <---------------
in
----------------> ---------------->
<---------------- (unused)另外,关闭双向通道应该关闭两个基础通道。
是可能的吗?
发布于 2015-09-25 07:59:26
如果我正确地理解了你的用例,我相信你想做的只是一个渠道的工作。
另一方面,如果您试图为多个通道的组合呈现一个类似通道的接口(例如,某些进程从in获取数据,处理数据,并将结果输出到out),那么您可以始终实现正确的协议 (在ClojureScript、cljs.core.async.impl.protocols/ReadPort和cljs.core.async.impl.protocols/WritePort的情况下)。
我个人不推荐它。撇开您将依赖于实现细节这一事实不说,我不认为core.async通道只是作为进程之间的通信点来封装流程。所以在这个用例中,只需将输入通道传递给生产者,输出通道传递给消费者。
发布于 2015-09-24 23:45:31
您的示例显示了这样一个基本流程:
io ---> out-ch ---> worker ---> in-ch ---> io
^-------------------------------------------*如果我们假设工作人员从in-ch读取并写入out-ch,那么在示例中这两个通道可能是相反的。如果工人做了相反的事情,那就是正确的。为了防止循环,重要的是使用非缓冲队列,这样您就不会听到自己的消息回显给自己。
顺便提一下,没有单向和双向通道这样的东西.相反,有缓冲和非缓冲通道。如果我们在一个缓冲频道上交谈,那么当我有话要对你说的时候,我会停下来,直到你碰巧听到了这个频道,然后一旦你准备好了,我就把我的信息放进这个频道,你就会收到它。然后,为了得到一个响应,我停车,直到你准备好发送,一旦你是,你把它放在频道上,我从频道(全部是一次)。这感觉就像一个双向通道,尽管它真的只是一个没有缓冲的通道恰好协调这种方式。
如果通道被缓冲,那么我可能会从通道中得到我自己的消息,因为我会把它放到通道上,然后准备好在您之前接收响应,甚至准备好接收原始消息。如果您需要使用这样的缓冲通道,那么使用其中的两个,每个方向一个,他们将“感觉”像单向通道。
https://stackoverflow.com/questions/32771702
复制相似问题