...waiting -offers +takers Le lundi 20 mai 2019 18:30:36 UTC+2, LaurentJ a écrit : > > You are not wrong. > > I think it was obvious for the author to consider that >!! will not block > if there are waiting offers. > > You can see it in the code, if no buffer is set the write method will > iterate over takers ready to consume the value. > > https://github.com/clojure/core.async/blob/91e6971a05fa49ca639fc1b7793141dd5f3d32ce/src/main/clojure/clojure/core/async/impl/channels.clj#L116 > > > > Le lundi 20 mai 2019 15:18:17 UTC+2, Brian Beckman a écrit : >> >> Thanks, Thomas. I shouldn't have included the quoted code about (<!! c) >> in my question because it distracts from what I really want to know, and >> what I want to know is all about how (go (<! c)) "makes buffer space >> available" so that (>!! c 42) doesn't block. >> >> The following is an attempt to clarify my question. I first (go (<! c)) >> and give the name d to the result, which is a channel that I am going >> read-from later. Channel d is "connected to" or "relayed from" c. I then >> (>!! c 42), and then (<!! d), both on the blocking "UI" thread. Everything >> works. I wasted your attention by writing some code that would block (<!! >> c) if it weren't quoted. >> >> Here is the part I don't understand: the documentation says that (>!! c >> 42) will block "if there is no buffer space available," and the >> documentation does not specify any other conditions. Well, I created c with >> no buffer space, so, (>!! c 42) must block unless something else "makes >> buffer space available," assuming the documentation is correct. The only >> other interaction with c that could possibly be alive at the time when I do >> (>!! c 42), is (go (<! c)), so (go (<! c)) must "make buffer space >> available," assuming the documentation is correct. My understanding of (<! >> c) (and I am suspicious of my understanding), is that (<! c) makes a >> rendezvous available, not a buffer. If that understanding is correct, then >> (>!! c 42) should block because there is no buffer available. >> >> On Sunday, May 19, 2019 at 1:48:16 PM UTC-7, Thomas Heller wrote: >>> >>> (<!! c) will hang because the value you put into c has already been >>> taken by the first go (running in a different thread). So it is blocking >>> until something puts another value into c. Since nothing ever does your >>> program hangs. >>> >>> If it helps you can read "go" as "please run this somewhere else, >>> possibly at a different time" and let the current thread continue after the >>> go. >>> >>> I can't explain this very well but the documentation aspect is accurate. >>> >>> On Sunday, May 19, 2019 at 7:33:07 PM UTC+2, Brian Beckman wrote: >>>> >>>> The documentation for >!! reads: >>>> >>>> ------------------------- >>>> clojure.core.async/>!! >>>> ([port val]) >>>> puts a val into port. nil values are not allowed. Will block if no >>>> buffer space is available. Returns true unless port is already closed. >>>> >>>> >>>> I have a case where I believe that the channel has no buffer, I park a >>>> "pseudothread" in a go block reading off that channel via <!, and then >>>> (lexically, not temporally), put to the unbuffered channel via >!!: >>>> >>>> (let [c (chan) ;; NO BUFFER! >>>> d (go (<! c)) ;; park a pseudothread to read c >>>> e (>!! c 42)] ;; blocking write to c, will unpark c's >>>> pseudothread >>>> (println {:c-coughs-up '(this will hang (<!! c)), >>>> :d-coughs-up (<!! d), >>>> :what's-e e}) >>>> (close! c) (close! d)) >>>> >>>> {:c-coughs-up (this will hang (<!! c)), :d-coughs-up 42, :what's-e true} >>>> >>>> >>>> This case leads me to wonder whether the documentation might read >>>> >>>> >!! will block if there is no buffer space available *and* if there >>>> is no *rendezvous *available, that is, no pseudothread parked waiting >>>> for <!. >>>> >>>> but it's more likely that I completely misunderstand core.async because >>>> I just made up the notion of a pseudothread in my struggle to understand! >>>> >>>> >>>> >>>>
-- 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. To view this discussion on the web visit https://groups.google.com/d/msgid/clojure/456c5363-a2fd-49e8-9de5-73ae9ffae075%40googlegroups.com. For more options, visit https://groups.google.com/d/optout.