gpt4 book ai didi

clojure - 帮助我使这个 noob 代码更加地道

转载 作者:行者123 更新时间:2023-12-02 07:11:25 26 4
gpt4 key购买 nike

所以我正在使用 congomongo(接近末尾的获取函数)从 mongodb 集合中提取一些文档。我想将选项传递给 fetch 调用,因此我可以执行类似 (posts :limit 1) 的操作,并让 {:limit 1} 传递给 fetch。我正在使用 @posts 进行手动“记忆化”,因为我希望能够重置缓存,据我所知,这无法通过 clojure.core/memoize 完成.

现在,我在这里看到的问题是 (fetch :posts options) 调用很重要,如果 dosync 必须重试事务,我真的宁愿不锤击我的数据存储。不过,我完全是个 clojure/fp 菜鸟,我不确定如何解决这个问题。另外,由于我是菜鸟,如果我在这里做的任何其他事情让你感到畏缩,我很想知道如何正确地写这篇文章。

(def posts (ref nil))
(defn reset-posts [] (dosync alter posts nil))

(defn fetch-posts [& options]
(let [options (apply array-map options)]
(or @posts
(dosync alter posts (fetch :posts options)))))

最佳答案

我不相信你的事务 block ((dosync alter...)会按照你的想法行事!

user=> (def posts (ref nil))
#'user/posts
user=> (dosync (ref-set posts [1 2 3 4 5]))
[1 2 3 4 5]
user=> @posts
[1 2 3 4 5]
user=> (dosync alter posts nil)
nil
user=> @posts
[1 2 3 4 5]

reset-posts 中,您可能需要 (dosync (ref-set posts nil)),而在 fetch-posts 中,语法修复将是 (dosync (ref-set posts (fetch :posts options)))

但是,fetch-posts 中存在竞争条件,即先检查后执行。可能没什么大不了的;不确定谁使用 fetch-posts,但是在事务中移动 或 @posts 位将避免 2 个并发事务最终都提交更改的情况。

关于 fetch-posts 的重试,是的,这可能会发生,尽管您的缓存解决方案避免了其中的大部分。不过,我不确定是否有没有锁定的方法。通常,对于交易中的 I/O 内容,您会将其外包给代理,但交易的成功取决于 fetch 的返回值,所以我不清楚它是如何工作的。

关于clojure - 帮助我使这个 noob 代码更加地道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5493500/

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