请在2024 Clojure 状态调查中分享您的想法!

欢迎!请参阅关于页面以获取更多关于如何工作的信息。

0
引用,代理,原子

我懂一点 Lisp,但 Clojure 感觉有点不同

(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

你的goroutine块太多了,不仅代码中的数量很多,执行的也很多。循环中的第一个goroutine块没有阻塞——它立即继续执行。不能保证当同样一个块再次执行时,前一个块有足够的时间将值放入通道。这是一个竞态条件。

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

代码段向通道发送10个数字,并将它们返回——除以二。

句子的一半是函数用户的实现细节,对此不感兴趣。如果你只需要从1开始得到一个除以2的10个数字向量,那么当然是(mapv #(/ % 2) (range 1 11))

如果你需要其他东西,请详细描述,这样我们就不会陷入XY问题。原始函数可以被重写为多种方式——如果您的真正问题需要特定的东西,则这些方法中没有任何一种是可能的。

我试图熟悉这个概念。并且我意识到mapv是一个更紧凑的解决方案。用简单的算术来展示这样的事情并不 uncommon。以下是一个Common Lisp的例子

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

但是我可以确认你预测的:随着10万次的重复,我得到

#{[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远不止这些。它们支持不同策略的缓存,允许反向压力,让您可以在静态或动态中将通道组合和分离,...
by
再次展示 by
谢谢。我现在开始清楚地看到它了。我真的没有看到竞争条件。
...