Могут ли агенты Clojure вызвать другого агента? - PullRequest
3 голосов
/ 25 ноября 2011

В последнее время я экспериментировал с возможностями многопоточности Clojure и пытался реализовать простую проблему параллелизма. В приведенном ниже коде я запускаю функцию write с одним агентом и пытаюсь отправить задание другому агенту, но программа блокирует эту строку:

(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))
)

Ответы [ 2 ]

4 голосов
/ 25 ноября 2011

Я не совсем уверен, что вы пытаетесь сделать, но функция rr определена, чтобы принимать один аргумент, но согласно

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

на самом деле должно быть два аргумента (первый - текущее значение агента, а второй - значение (inc j).

Выражение (agent-error (first writers)) должно раскрыть какое-то исключение Arity (хотя я не пробовал)

2 голосов
/ 26 ноября 2011

Clojure агенты могут отправлять другим агентам как из refs, так и atoms.Любые сообщения, отправляемые этой функцией, сохраняются до тех пор, пока не будет завершено изменение агента, поэтому вам не нужно беспокоиться о том, что они будут соревноваться сами с собой.

на главной странице агентов есть пример размещения агентов в кольце

на боковой заметке, если вы отправляете сообщения из ref и dosync тогда сообщения гарантированно будут отправлены только один раз, поскольку транзакция фиксируется.В целом все инструменты параллелизма Clojure предназначены для объединения как с самими собой, так и с другими инструментами параллелизма

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...