将其他线程本地定义的原子?

时间:2016-01-14 12:25:29

标签: clojure

我必须遵循自动化代码,该函数接受一个唯一的数字,并启动Firefox。我可以启动多个线程,每个线程都有一个唯一的x传递给函数,因此该函数将同时执行。那么本地原子当前页面对其他线程是否可见?如果可见,那么重置!可以将原子设置为另一个线程的期望值

(defn consumer-scanning-pages [x]
  (while true
    (let [driver (get-firefox x)
          current-page (atom 0)]
             ....
            (reset! current-page ..)
      )))

2 个答案:

答案 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)

不会。每次调用函数时,您都在创建一个新原子。

如果你想要一个共享原子,只需将原子作为参数传递给消费者扫描页面