【问题标题】:Clojure core.async, channel vs portClojure core.async,通道与端口
【发布时间】:2015-07-11 21:01:41
【问题描述】:

在 Clojure core.async 中,通道和端口是一回事吗?如果不是,有什么区别?在观看视频Timothy Baldridge - Core.Async时,他创建了一个频道

(def c (chan))

后来

(<!! c)

c 是频道,但 &lt;!! 状态的文档(已添加重点)

用法:(port 获取 val。如果关闭,将返回 nil。 如果没有可用的,将阻塞。

core.async docs不清楚。

【问题讨论】:

    标签: clojure core.async


    【解决方案1】:

    是的,通道是端口。

    端口是这些实现的协议的名称

    (defprotocol ReadPort
      (take! [port fn1-handler] "derefable val if taken, nil if take was enqueued"))
    

    impl/take 在:

    (defn <!!
      "takes a val from port. Will return nil if closed. Will block if nothing is available."
      [port]
      (let [p (promise)
            ret (impl/take! port (fn-handler (fn [v] (deliver p v))))]
        (if ret
          @ret
          (deref p))))
    

    并且名称端口在整个 async.clj 中非常一致地使用。从概念上讲,这很有用,因为并非 core.async 处理的所有内容都是通道。其他东西可以实现 ReadPort 和 WritePort,因此可以很好地与 core.async 配合使用。

    【讨论】:

    • 您的回答虽然写得很好,但并不能解释为什么我需要知道 chan 和 port 之间的区别。文档显示
    • 如果您添加了实现端口接口的新数据类型以允许它从 core.async 生态系统中的其他事物发送和接收数据,您只需要知道区别。 Chans 是端口,其他东西也是。
    猜你喜欢
    • 2015-07-04
    • 1970-01-01
    • 2019-02-13
    • 2014-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-07
    相关资源
    最近更新 更多