The behaviour of timeout channels is to close after the timeout
elapses. This will be visible everywhere the channel is used.

Cheers,
Michał


On 20 November 2013 11:22, Cedric Greevey <cgree...@gmail.com> wrote:
> Isn't that not only violating least astonishment, but potentially
> introducing a terrible bug into the library? One could use "two different"
> timeout channels in two different alts, and if the timeout channels are
> aliased, then perhaps only one of the alts would actually get notified.
>
>
> On Wed, Nov 20, 2013 at 5:05 AM, Michał Marczyk <michal.marc...@gmail.com>
> wrote:
>>
>> The reason = considers you timeout channels to be equal is that they
>> are, in fact, the same object. In fact, they may end up being the same
>> object even with different timeout values:
>>
>> (identical? (timeout 1) (timeout 2))
>> ;= true
>>
>> Except I got a false just now with a fresh REPL and same timeout
>> value... All subsequent invocations return true though, and I'm sure
>> with a little digging the reason for the false would become clear.
>>
>> The reason for them being the same object is that timeout goes out of
>> its way to avoid creating to many timeout channels and will reuse
>> existing ones if their timeouts are due within a small amount of time
>> (clojure.core.async.impl.timers/TIMEOUT_RESOLUTION_MS, currently 10
>> ms) of the requested timeout.
>>
>> Cheers,
>> Michał
>>
>> On 20 November 2013 10:08, Thomas G. Kristensen
>> <thomas.g.kristen...@gmail.com> wrote:
>> > Hi all,
>> >
>> > I ran into a core.async behaviour that confused me a bit the other day.
>> > In
>> > some of our systems, we need to fire different timeouts, perform actions
>> > and
>> > schedule a new timeout. The problem is, that if the timeouts are of the
>> > same
>> > number of ms, we can't distinguish them, and therefore not keep track of
>> > and
>> > remove them from a set (at least not easily).
>> >
>> > That sounds a bit fuzzy. Hopefully this spike will make it clearer what
>> > I'm
>> > trying to say:
>> >
>> > (require '[clojure.core.async :refer [chan timeout alts!! alts!]])
>> >
>> > (= (chan) (chan))
>> > ;; false
>> >
>> > (= (timeout 1) (timeout 2))
>> > ;; false
>> >
>> > (= (timeout 1) (timeout 1))
>> > ;; true
>> >
>> > (do (loop [ch->v (into {} (for [v [1 2 3]] [(timeout 1000) v]))]
>> >       (when-let [chs (keys ch->v)]
>> >         (let [[_ ch] (alts!! chs)]
>> >           (println (ch->v ch))
>> >           (recur (dissoc ch->v ch)))))
>> >     (println "done"))
>> > ;; only fires "3", the last channel in the map
>> >
>> > The intended behaviour of the last loop is to print 1, 2 and 3 (not
>> > necessarily in that order). However, the ch->v map will only contain one
>> > key, as timeouts with the same duration are considered the same value.
>> > In
>> > the real example, a new timeout with the same value should be scheduled
>> > again, by being put in the map.
>> >
>> > So, my questions are:
>> >
>> > - Is this intended behaviour?
>> > - Is there a different pattern for achieving the scheduling behaviour
>> > I'm
>> > looking for?
>> >
>> > Thanks for your help,
>> >
>> > Thomas
>> >
>> > --
>> > --
>> > You received this message because you are subscribed to the Google
>> > Groups "Clojure" group.
>> > To post to this group, send email to clojure@googlegroups.com
>> > Note that posts from new members are moderated - please be patient with
>> > your
>> > first post.
>> > To unsubscribe from this group, send email to
>> > clojure+unsubscr...@googlegroups.com
>> > 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 clojure+unsubscr...@googlegroups.com.
>> > For more options, visit https://groups.google.com/groups/opt_out.
>>
>> --
>> --
>> You received this message because you are subscribed to the Google
>> Groups "Clojure" group.
>> To post to this group, send email to clojure@googlegroups.com
>> Note that posts from new members are moderated - please be patient with
>> your first post.
>> To unsubscribe from this group, send email to
>> clojure+unsubscr...@googlegroups.com
>> 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 clojure+unsubscr...@googlegroups.com.
>> For more options, visit https://groups.google.com/groups/opt_out.
>
>
> --
> --
> You received this message because you are subscribed to the Google
> Groups "Clojure" group.
> To post to this group, send email to clojure@googlegroups.com
> Note that posts from new members are moderated - please be patient with your
> first post.
> To unsubscribe from this group, send email to
> clojure+unsubscr...@googlegroups.com
> 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 clojure+unsubscr...@googlegroups.com.
> For more options, visit https://groups.google.com/groups/opt_out.

-- 
-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
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 clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to