gpt4 book ai didi

concurrency - Clojure 代理可以调用​​另一个代理吗?

转载 作者:行者123 更新时间:2023-12-01 11:03:39 25 4
gpt4 key购买 nike

我最近一直在试验 Clojure 的多线程功能,并试图实现一个简单的并发问题。在下面的代码中,我用一个代理运行函数写入并尝试将作业发送给另一个代理,但程序在这一行阻塞:

(doseq [j (range (count readers))]
(send (nth readers j) rr (inc j)))

完整代码:

(def state (ref 0))
(def readers (doall (map #(agent %) (repeat 3 0))))
(def writers (doall (map #(agent %) (repeat 3 0))))

(defn rr [re]
(println (format "Read about %s" @state))
(inc re)
)

(defn write [re topic]
(dosync
(ref-set state topic)
)
(Thread/sleep (rand-int 1000))
(println "Wrote about" topic)
(doseq [j (range (count readers))]
(send (nth readers j) rr (inc j)))
(inc re)
)

(defn -main[]
(dotimes [i 5]
(doseq [j (range (count writers))]
(send (nth writers j) write (inc j))))
(dorun (map #(await %) writers))
(dorun (map #(println "Writes:" @%) writers))
)

最佳答案

我不完全确定您要做什么,但是函数 rr 被定义为接受一个参数,但是根据

(send (nth readers j) rr (inc j))

它实际上应该有两个参数(第一个是代理的当前值,第二个参数是 (inc j) 的值。

表达式 (agent-error (first writers)) 应该揭示某种 Arity 异常(尽管我还没有尝试过)

关于concurrency - Clojure 代理可以调用​​另一个代理吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8271731/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com