(def my-agent (agent 1))
(defn sleep-and-multiply [old-state times ms]
(Thread/sleep ms)
(* old-state times))
(send-off my-agent sleep-and-multiply 2 1500)
(send-off my-agent sleep-and-multiply 3 1000)
(await my-agent)
(println "my-agent =" @my-agent)
--
R. Mark Volkmann
Object Computing, Inc.
The part above isn't related to my example.
> user=> (def my-agent (agent 1))
> #'user/my-agent
> user=> (defn sleep-and-multiply [old-state ms]
> (Thread/sleep ms)
> (* old-state times))
> java.lang.Exception: Unable to resolve symbol: times in this context
> (NO_SOURCE_FILE:7)
This is missing the "times" parameter.
> user=> ;
> (defn sleep-and-multiply [old-state n ms]
> (Thread/sleep ms)
> (* old-state n))
> #'user/sleep-and-multiply
This looks fine. You're just naming the parameter "n" instead of
"times", but it works the same.
> user=> (send-off my-agent sleep-and multiply 2 1500)
> java.lang.Exception: Unable to resolve symbol: sleep-and in this
> context (NO_SOURCE_FILE:12)
You're missing a hyphen in "sleep-and-multiply".
> user=> (send-off my-agent sleep-and- multiply 2 1500)
> java.lang.Exception: Unable to resolve symbol: sleep-and- in this
> context (NO_SOURCE_FILE:13)
You've got a space in "sleep-and-multiply".
> user=> (send-off my-agent sleep-and-multiply 2 1500)
> #<Agent clojure.lang.Agent@9a99eb>
> user=> (send-off my-agent sleep-and-multiply 3 1500)
> #<Agent clojure.lang.Agent@9a99eb>
> user=> (await my-agent)
> nil
> user=> (println "my-agent=" @my-agent)
> my-agent= 6
> nil
> user=> (shutdown-agents)
> nil
All this is correct!
> user=> (def my-agent (agent 10))
Redefining the agent to start with a different value.
> #'user/my-agent
> user=> (defn sleep-and-multiply [old-state n ms]
> (Thread/sleep ms)
> (+ old-state n))
> #'user/sleep-and-multiply
Why are you defining that function again?
Oh I see. You're using addition instead of multiplication.
> user=> (send-off my-agent sleep-and-multiply 7 1500)
> java.util.concurrent.RejectedExecutionException (NO_SOURCE_FILE:0)
I don't know why you're getting that error.
> user=> (send-off my-agent sleep-and-multiply 3 1500)
> #<Agent clojure.lang.Agent@3a5a9c>
> user=> (send-off my-agent sleep-and-multiply 7 1500)
> #<Agent clojure.lang.Agent@3a5a9c>
> user=> (println "my-agent = " @my-agent)
> my-agent = 10
> nil
Yikes! I'm sure you expected the result to be 20. The value didn't get
changed! I don't know why.
> user=> (agent-errors my-agent)
> nil
> user=> (clear-agent-errors my-agent)
> nil
> user=> (println "my-agent = " @my-agent)
> my-agent = 10
> nil
> user=> (send-off my-agent sleep-and-multiply 7 1500)
> #<Agent clojure.lang.Agent@3a5a9c>
> user=> (println "my-agent = " @my-agent)
> my-agent = 10
> nil
> user=> (send-off my-agent sleep-and-multiply 3 1500)
> #<Agent clojure.lang.Agent@3a5a9c>
> user=> (println "my-agent = " @my-agent)
> my-agent = 10
> nil
Does anyone know why the value of the agent isn't getting changed?
The error is because you shut down the agent pools. Don't do that
until you're done sending actions to agents!
--Chouser