Fork me on GitHub
#cider
<
2021-04-05
>
yuhan05:04:01

How do I deal with agents without breaking Cider's connection? Running (shutdown-agents) results in this error in the terminal, and I have to restart the REPL entirely:

Exception updating the ns-cache #error {
 :cause Task clojure.lang.Agent$Action@45416446 rejected from java.util.concurrent.ThreadPoolExecutor@58b7be40[Terminated, pool size = 0, active threads = 0, queued tasks = 0, completed tasks = 90]
 :via
 [{:type java.util.concurrent.RejectedExecutionException
   :message Task clojure.lang.Agent$Action@45416446 rejected from java.util.concurrent.ThreadPoolExecutor@58b7be40[Terminated, pool size = 0, active threads = 0, queued tasks = 0, completed tasks = 90]
   :at [java.util.concurrent.ThreadPoolExecutor$AbortPolicy rejectedExecution ThreadPoolExecutor.java 2055]}]
 :trace
 [[java.util.concurrent.ThreadPoolExecutor$AbortPolicy rejectedExecution ThreadPoolExecutor.java 2055]
  [java.util.concurrent.ThreadPoolExecutor reject ThreadPoolExecutor.java 825]
  [java.util.concurrent.ThreadPoolExecutor execute ThreadPoolExecutor.java 1355]
  [clojure.lang.Agent$Action execute Agent.java 90]
  [clojure.lang.Agent enqueue Agent.java 268]
  [clojure.lang.Agent dispatchAction Agent.java 255]
  [clojure.lang.Agent dispatch Agent.java 241]
  [clojure.core$send_via invokeStatic core.clj 2113]
  [clojure.core$send_via doInvoke core.clj 2105]
  [clojure.lang.RestFn applyTo RestFn.java 146]
  [clojure.core$apply invokeStatic core.clj 673]
  [clojure.core$send invokeStatic core.clj 2124]
  [clojure.core$send doInvoke core.clj 2115]
  [clojure.lang.RestFn invoke RestFn.java 490]
  [cider.nrepl.middleware.track_state$make_transport$reify__5814 send track_state.clj 230]
  [nrepl.middleware.interruptible_eval$interruptible_eval$fn__994$fn__1000 invoke interruptible_eval.clj 153]
  [clojure.lang.AFn run AFn.java 22]
  [nrepl.middleware.session$session_exec$main_loop__1062 invoke session.clj 206]
  [clojure.lang.AFn run AFn.java 22]
  [java.lang.Thread run Thread.java 830]]}

dpsutton05:04:45

i don't think that's something you should call unless you are ready for the process to end. you are stopping two global executors and CIDER uses those global threadpools

yuhan05:04:35

Hmm, I'm just learning about Agents and core.async, and tutorials mention the use of shutdown-agents to kill off running threads. I can't seem find any more fine-grained methods for doing so without affecting the entire global threadpool

dpsutton05:04:03

that's generally to kill threads in preparation of shutting down

yuhan05:04:16

eg. if I run a (go (while true (>! ch :msg))) there's now a process running indefinitely in the background, how do I stop it?

dpsutton05:04:21

if you need more cooperative "stop doing work" there are other means. closing channels

dpsutton05:04:55

there's lots of ways but that's not a great thing to do if you ever want to stop it

dpsutton05:04:51

a common thing to do is make that into a loop that can recur when the puts are successful, etc

yuhan05:04:51

Right, this is just in the context of messing around with experiments in the REPL

yuhan05:04:43

Just wanted to make sure if this was expected behavior for Cider

dpsutton05:04:19

yeah that would be expected. you stopped the agent executors, and then got an error that CIDER couldn't send a message to an agent

👌 3