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.
配合使用
在 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.
配合使用