Hello,
I'm trying to process messages from 2 core.async channels at the same time
using alts!! but I'm running into problems when one of the channels closes
early. Specifically I have this function:
(defn >print [a b]
(loop [limit 20] ;;limit to prevent infinite loop demonstrated below
(let [[v c] (alts!! [a b] :default ::done)]
(if (and (not= c :default) (> limit 0))
(do
(if (= c a)
(println "a:" v)
(println "b:" v))
(recur (dec limit))))))
nil)
If I run this, it works as expected:
(let [a (chan 10)
b (chan 10)]
(>!! a 1)
(>!! a 1)
(>!! a 1)
(>!! a 1)
(>!! b 2)
(>!! b 2)
(>!! b 2)
(>!! b 2)
(>!! b 2)
(>print a b))
Output:
b: 2
a: 1
a: 1
b: 2
b: 2
a: 1
b: 2
b: 2
a: 1
If I close "a" early...
(let [a (chan 10)
b (chan 10)]
(>!! a 1)
(close! a)
(>!! a 1)
(>!! a 1)
(>!! a 1)
(>!! b 2)
(>!! b 2)
(>!! b 2)
(>!! b 2)
(>!! b 2)
(>print a b))
This is what I get:
a: 1
b: 2
b: 2
b: 2
a: nil
a: nil
b: 2
b: 2
a: nil
a: nil
a: nil
a: nil
a: nil
a: nil
a: nil
a: nil
a: nil
a: nil
a: nil
a: nil
This code would continue running forever if it wasn't for the "limit"
condition above. Am I using alts!! in a manner it's not meant to be used?
Thanks,
Stathis
--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
---
You received this message because you are subscribed to the Google Groups
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.