2024 Clojure 状态调查!分享你的想法。

欢迎!请参阅关于页面以获得有关此功能的一些更多信息。

0
引用、代理、原子

我懂一点小的 Lisp,Clojure feels a bit different

(defn mojorate []
  (let [v (vec (range 1 11))
        max (- (count v) 1)
        atomix (atom [])
        chanl (async/chan)]
    (println v)
    (loop [i 0]
      (async/go
        (>! chanl (swap! atomix conj (/ (get v i) 2))))
      (if (= i max)
        (do (<!! (async/go (<! chanl)))
          (async/close! chanl)
          @atomix)
        (recur (inc i))))))

这只是一个关于通道、原子、loop/recur 等的练习。

你能这样做吗?

不确定你实际上在问什么 - 你能详细说明一下吗?
它按预期工作,但我不确定这是否 1.:符合习惯用法 2.:最佳实践。 3.:或可以做得更好。
但“预期”是什么意思?函数*应该*做什么?当运行它时,我会在不同的运行中看到不同的结果,所以我无法确切地推断你真正需要什么。
我总是得到
testomato.core>(mojorate)
[1 2 3 4 5 6 7 8 9 10]                                                                      
[1/2 1 3/2 2 5/2 3 7/2 9/2 5]

代码段将10个数字发送到通道并接收它们——除以两

1 答案

+1

您有太多的go块,不仅代码中数量很多,而且执行的数量也很多。循环中的第一个go块没有阻塞——它立即让执行继续。无法保证在执行相同的块之前有足够的时间将值放入通道。这是一个竞争条件。

为了确认,只需运行此代码:(set (repeatedly 10000 mojorate))。如果所有得到的是只有一个元素的集合,请增加数字。

代码段将10个数字发送到通道并接收它们——除以两

句子的前半部分是函数用户的实现细节,与函数用户的焦点无关。如果您需要的只是一组从1开始、除以2的10个数字向量,那么它当然是(mapv #(/ % 2) (range 1 11))

如果需要其他内容,请详细描述,这样我们不会陷入XY问题。原始函数可以被重写为多种方式——如果您的实际问题需要特定的内容,则所有这些方式都可能是错误的。

by
我试图熟悉这个概念。我发现mapv是一个更紧密的解决方案。简单的算术运算通常用于演示此类情况。下面是一些Common Lisp的示例

(let ((channel (make-channel)))
  (submit-task channel '+ 3 4)
  (receive-result channel))

但我可以证实你所预测的结果:在100,000次重复中,我得到了

#{[1/2 1 3/2 2 5/2 3 7/2 4 9/2 5]
  [1 3/2 2 5/2 3 7/2 4 9/2 5 1/2]
  [1/2 1 3/2 2 5/2 3 7/2 4 9/2]
  [1/2 1 2 5/2 3 7/2 4 9/2 5 3/2]}
by
据我所知,Common Lisp中的channels和`clojure.core.async`中的channels并不相同。它们更像是一种与特定线程进行通信的方式。在Clojure中,如果你只想在单独的线程中运行一系列的计算,那么使用`future`或`pmap`会更好(尽管通常建议避免使用`pmap`,而是使用可控制的事物)。Clojure中的异步channel在你希望在某个位置提供值,可能在第二个位置对这些值执行一些计算,并在第三个位置接收结果时很有用,而这些位置可能根本不知道彼此。例如,生产者可能使用`(a/to-chan! (range 1 11))`,转换器可能使用`(a/map #(/ % 2) [channel])`,消费者可能使用`(a/go (let [all-values (a/<! (a/into [] transformed-channel))] ...))`。
by
当然,Clojure中的channels远不止这些。它们支持使用不同的策略进行缓冲、允许进行压力反馈、允许静态或动态地组合和分离channels...

重置
感谢。我现在开始清楚地看到这一点了。我真的没有看到竞争条件。
...