我必须遵循自动化代码,该函数接受一个唯一的数字,并启动Firefox。我可以启动多个线程,每个线程都有一个唯一的x传递给函数,因此该函数将同时执行。那么本地原子当前页面对其他线程是否可见?如果可见,那么重置!可以将原子设置为另一个线程的期望值
(defn consumer-scanning-pages [x]
(while true
(let [driver (get-firefox x)
current-page (atom 0)]
....
(reset! current-page ..)
)))
答案 0 :(得分:3)
原子对于你明确传递给它的那些线程是可见的,对于那些线程传递给它的任何其他线程都是可见的。在这方面你可能对任何其他值都没有区别。或者可能不会四处传播。
"将原子传递给一个线程"可以像引用范围内的本地一样简单,它存储在Clojure线程启动表单的主体中:
(let [a (atom :foo)]
;; dereferencing the future object representing an off-thread computation
@(future
;; dereferencing the atom on another thread
@a))
;;= :foo
仅仅创建一个原子并不能使它可用于未明确提供的代码,对于最初创建原子的线程上运行的代码也是如此。 (考虑一个创建一个原子的函数,但从不将它存储在任何外部可见的数据结构中,并最终返回一个不相关的值。当函数最迟返回时,它创建的原子将符合GC的条件;任何原子都不会看到它其他代码,在相同或任何其他线程上。)同样,所有其他值也是如此。
答案 1 :(得分:1)
不会。每次调用函数时,您都在创建一个新原子。
如果你想要一个共享原子,只需将原子作为参数传递给消费者扫描页面