gpt4 book ai didi

multithreading - clojure 是 "multithread"吗?

转载 作者:行者123 更新时间:2023-12-03 13:14:22 28 4
gpt4 key购买 nike

我的问题可能看起来很奇怪,但我想我正面临着 volatile 的问题。对象。

我写了一个这样实现的库(只是一个方案,不是真正的内容):

(def var1 (volatile! nil))
(def var2 (volatile! nil))

(def do-things [a]
(vreset! var1 a)
(vswap! var2 (inc @var2))
{:a @var1 :b @var2})

所以我有由外部值初始化的全局变量,其他值是计算出来的,我返回它们的内容。
我使用 volatile 比使用原子具有更好的速度,并且不会每次为每次计算都重新定义一个新的 var。

问题是这在实践中似乎失败了,因为我 map对一个集合(在另一个程序中)做一些事情,有时会调用这个函数的内部子调用,比如(伪代码):
(map 
(fn [x]
(let [analysis (do-things x)]
(if blabla
(do-things (f x))
analysis)))) coll)

内部条件调用会在幕后产生另一个线程吗?似乎是的,因为有时调用有效,有时无效。
除了在每个 do-things 中定义 volatile 之外,还有其他方法吗? body ?

编辑

实际上,错误是另一回事,但问题仍然存在:这是一种可接受/安全的方法,无需对多线程功能进行任何显式调用?

最佳答案

Clojure 中很少有代表您创建线程的构造——通常 Clojure 可以并且将在一个或多个线程上运行,具体取决于您如何构建程序。 pmap是一个很好的示例,它创建和管理要并行映射的线程池。另一个是clojure.core.reducers/fold ,它使用 fork/join 池,但实际上就是这样。在所有其他情况下,由您来创建和管理线程。

仅在您控制使用范围的情况下,才应非常小心地使用 Volatiles,以确保您不会与线程竞争读取和写入相同的 volatile。 Volatiles 保证可以在另一个线程上读取写入,但它们不保证原子性。为此,您必须使用原子(用于未协调)或 refs 和 STM(用于协调)。

关于multithreading - clojure 是 "multithread"吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42115209/

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