Clojure core.async,通道与端口

Clojure core.async, channel vs port

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

(def c (chan))

以后

(<!! c)

c 是频道,但 <!! 状态的文档(添加了强调)

Usage: (<!! port) takes a val from port. Will return nil if closed. Will block if nothing is available.

core.async docs看不清楚。

是的,chans 是端口。

端口在这些实现的协议的名称中

(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))))

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

配合使用