首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >core.async合并单向信道

core.async合并单向信道
EN

Stack Overflow用户
提问于 2015-09-24 22:05:32
回答 2查看 270关注 0票数 2

我有两个单向core.async频道:

  • 通道输出只能是put!
  • 只能使用take!的通道

由于这是ClojureScript,所以阻塞操作不可用。我想做一个双向(输入和输出)通道从这两个(进出)。

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

我尝试了以下一些方法(不起作用):

代码语言:javascript
复制
(defn io-chan [in-ch out-ch]
  (let [io (chan)]
    (go-loop []
      (>! out-ch (<! io ))
      (>! io (<! in-ch))
      (recur))
    io))

架构可能会有帮助:

代码语言:javascript
复制
    out                              in-out
 ---------------> (unused)         
 <---------------             <---------------

   in
---------------->             ---------------->
<---------------- (unused)

另外,关闭双向通道应该关闭两个基础通道。

是可能的吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-09-25 07:59:26

如果我正确地理解了你的用例,我相信你想做的只是一个渠道的工作。

另一方面,如果您试图为多个通道的组合呈现一个类似通道的接口(例如,某些进程从in获取数据,处理数据,并将结果输出到out),那么您可以始终实现正确的协议 (在ClojureScript、cljs.core.async.impl.protocols/ReadPortcljs.core.async.impl.protocols/WritePort的情况下)。

我个人不推荐它。撇开您将依赖于实现细节这一事实不说,我不认为core.async通道只是作为进程之间的通信点来封装流程。所以在这个用例中,只需将输入通道传递给生产者,输出通道传递给消费者。

票数 1
EN

Stack Overflow用户

发布于 2015-09-24 23:45:31

您的示例显示了这样一个基本流程:

代码语言:javascript
复制
io ---> out-ch ---> worker ---> in-ch ---> io
^-------------------------------------------*

如果我们假设工作人员从in-ch读取并写入out-ch,那么在示例中这两个通道可能是相反的。如果工人做了相反的事情,那就是正确的。为了防止循环,重要的是使用非缓冲队列,这样您就不会听到自己的消息回显给自己。

顺便提一下,没有单向和双向通道这样的东西.相反,有缓冲和非缓冲通道。如果我们在一个缓冲频道上交谈,那么当我有话要对你说的时候,我会停下来,直到你碰巧听到了这个频道,然后一旦你准备好了,我就把我的信息放进这个频道,你就会收到它。然后,为了得到一个响应,我停车,直到你准备好发送,一旦你是,你把它放在频道上,我从频道(全部是一次)。这感觉就像一个双向通道,尽管它真的只是一个没有缓冲的通道恰好协调这种方式。

如果通道被缓冲,那么我可能会从通道中得到我自己的消息,因为我会把它放到通道上,然后准备好在您之前接收响应,甚至准备好接收原始消息。如果您需要使用这样的缓冲通道,那么使用其中的两个,每个方向一个,他们将“感觉”像单向通道。

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

https://stackoverflow.com/questions/32771702

复制
相关文章

相似问题

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