`(chan n)`和`(chan (buffer n))`之间有什么区别吗?

正如标题所问的那样,这两者之间有什么区别吗?(chan n)(chan (buffer n)) 在使用时?

这个问题源于我想从db(是的,我不想使用Kafka或RabbitMQ)中提取消息并按顺序处理它们。

所以代码段看起来像这样。

(defn processer [id]
  (let [ch (chan (buffer 1000))]  ;;(chan 1000) or (chan (buffer 1000))?
    (go-loop []
      (when-let [msg (<! ch)]
        (process-msg msg))
      (recur))
    ch))

(defn enqueue [id]
  (let [ch (processer id)]
    (go-loop []
      (let [msgs (take-100-msg-from-db id)]
        (if (seq msgs)
          (doseq [msg msgs]
            (>! ch msg))
          (<! (timeout 100))))
      (recur))))

在我的测试中,它们的行为并没有不同。

解决方案:

是的,它们是一样的。

你可以随时查看 源头:

(defn chan
  ([] (chan nil))
  ([buf-or-n] (chan buf-or-n nil))
  ([buf-or-n xform] (chan buf-or-n xform nil))
  ([buf-or-n xform ex-handler]
     (channels/chan (if (number? buf-or-n) (buffer buf-or-n) buf-or-n) xform ex-handler)))

给TA打赏
共{{data.count}}人
人已打赏
未分类

在句子中随机洗练字母。

2022-11-13 21:16:16

未分类

无法在柏树中获取Iframe下的元素[关闭]。

2022-11-13 21:16:18

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索