Clojure core.async,通道 vs 端口

10
在Clojure core.async中,通道(channels)和端口(ports)是同一件事吗?如果不是,它们有什么区别?在观看视频Timothy Baldridge - Core.Async时,他创建了一个通道。
(def c (chan))

之后

(<!! c)

c 是通道,但是 <!! 的文档(强调添加)说明:

用法:(<!! port) 从 port 中取出一个值。如果已关闭,则返回 nil。 如果没有可用的值,则会阻塞。

core.async 文档上看并不清楚。

1个回答

14

是的,chans就是端口。

端口(port)在这些协议的名称中实现。

(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中,名称端口(port)被非常一致地使用。从概念上讲,这很有用,因为core.async处理的不是所有东西都是通道(channel)。其他东西可以实现ReadPort和WritePort,因此可以与core.async良好地合作。


您的回答写得很好,但没有解释为什么我需要知道通道(chan)和端口(port)之间的区别。文档中显示在 go-block 中调用 <! ,但为什么没有 <!! 呢? - Petrus Theron
1
只有当您添加一个新的数据类型来实现端口接口以便它可以在 core.async 生态系统中与其他设备交换数据时,才需要了解其差异。通道是端口,其他设备也是如此。 - Arthur Ulfeldt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接