You can do that without a pub, the producer can send a new (chan) inside the request to the go-loop and the go-loop will ack on that chan when getting a good response from the external service. That schema solves this scenario, I mentioned it in the previous mail, but I think a peek operation maybe could be better and can simplify the producer code.
Saludos, Nahuel Greco. On Sun, Oct 5, 2014 at 1:57 PM, <adrian.med...@mail.yu.edu> wrote: > Ah, I think we're on the same page now. I've come across the need for this > recently in some code for a UDP based protocol between a multiplayer game > client and server. > > I still think a pub fits in here nicely. You can consume the value from > the channel in question and park until you get an acknowledgment from the > external service (or timeout). The producer would subscribe to another > topic on your pub that will get a value put onto it when acknowledgment or > time out occurs in the consumer. Be sure to close the subs after you've > gotten the ack or timed out. > > On Sunday, October 5, 2014 12:40:25 PM UTC-4, Nahuel Greco wrote: >> >> previous example with the peek operation: >> >> 1- The producer puts a value to a unbuffered (chan) by doing (>! c v) >> 2- The go-loop unparks from (peek<! c) without consuming the value, the >> producer keeps parked >> 3- The go-loop contacts the external-service >> 4-A If the external-service answer is ok, the go-loop consume (and >> discard) the value by doing a normal (<! c), and the producer unparks >> 4-B If the external-service answers it cannot process the value, the >> go-loop waits until a timeout to retry step 3 >> >> The producer only unparks when the value is effectively consumed by the >> external service. That's my objective. >> >> I think your pub proposal replaces the take-if proposal given before, but >> I think take-if (and pub) doesn't work for this scenario. >> >> >> Saludos, >> Nahuel Greco. >> >> On Sun, Oct 5, 2014 at 1:20 PM, <adrian...@mail.yu.edu> wrote: >> >>> Then how would peeking at the value help? >>> >>> On Sunday, October 5, 2014 12:14:32 PM UTC-4, Nahuel Greco wrote: >>>> >>>> Adrian: I don't see how a pub can help here, in the previous example to >>>> consume or not the value was decided not on some property intrinsic to the >>>> value (one you can create a topic from), but on the result of sending it to >>>> an external service. >>>> >>>> >>>> Saludos, >>>> Nahuel Greco. >>>> >>>> On Sun, Oct 5, 2014 at 12:59 PM, <adrian...@mail.yu.edu> wrote: >>>> >>>>> I think you can achieve an effect similar to what you want by using a >>>>> pub with an appropriate topic function that classifies the input in some >>>>> way, and then subscribing to the topic whose value you want to see. This >>>>> also has the benefit of automatically 'mult'ing the channel input, so you >>>>> can have multiple consumers looking for the same value. >>>>> >>>>> On Sunday, October 5, 2014 11:33:16 AM UTC-4, Nahuel Greco wrote: >>>>>> >>>>>> Picture the following: >>>>>> >>>>>> producer ---> go-loop ---> external service >>>>>> >>>>>> 1- The producer puts a value to a unbuffered (chan) by doing (>! c v) >>>>>> 2- The go-loop consumes the value with a take operation, >>>>>> **unblocking** the producer >>>>>> 3- The go-loop contacts the external-service but the external service >>>>>> answers it can't process the value yet >>>>>> 4- The go-loop waits some timeout to retry the request to the >>>>>> external service >>>>>> >>>>>> After step 2 the producer continues to compute (suppose an expensive >>>>>> computing) a new value but the previous one wasn't effectively consumed >>>>>> by >>>>>> the external service. >>>>>> I don't want that, I want to enforce an end-to-end flow-control setup >>>>>> where the producer blocks on (>! c v) (the step 1) until the value is >>>>>> consumed by all parties, >>>>>> >>>>>> Sure, this flow control can be solved adding an ack channel and >>>>>> sending an ack from the go-loop to the producer when the external service >>>>>> effectively consumes the value, previously blocking the producer after >>>>>> step >>>>>> 1 waiting that ack. >>>>>> But I think a peek operation in step 2 will be more elegant. Also, I >>>>>> was curious if the implementation of core.async channels limits in some >>>>>> way >>>>>> adding a peek operation. >>>>>> >>>>>> A take-if with a pure predicate can't solve this, because you need to >>>>>> contact the external service to decide to consume the value or not. >>>>>> >>>>>> >>>>>> Saludos, >>>>>> Nahuel Greco. >>>>>> >>>>>> On Sun, Oct 5, 2014 at 9:52 AM, Fluid Dynamics <a209...@trbvm.com> >>>>>> wrote: >>>>>> >>>>>>> On Sunday, October 5, 2014 12:51:04 AM UTC-4, Nahuel Greco wrote: >>>>>>>> >>>>>>>> I was thinking in a single-consumer scenario with a buffered chan, >>>>>>>> in which you want to check if you can consume the value before >>>>>>>> effectively >>>>>>>> consuming it. As you said, a peek operation has no sense if the >>>>>>>> channel has >>>>>>>> multiple consumers. >>>>>>>> >>>>>>> >>>>>>> And if you can't consume the value, then what? Nothing ever does, >>>>>>> and that channel becomes useless? >>>>>>> >>>>>>> Actually the only "peek" operation that to me makes much sense would >>>>>>> be a (take-if pred chan) or something similar, which atomically tests >>>>>>> the >>>>>>> next value with pred and consumes it or not, so, it can't be consumed >>>>>>> elsewhere between the pred test and optional consumption here. And if >>>>>>> not >>>>>>> consumed, two behaviors both occur to me as possible -- return nil or >>>>>>> some >>>>>>> other sentinel value for "do not want" or block until the unwanted >>>>>>> object >>>>>>> is consumed by someone else and then test the next item, etc.; at which >>>>>>> point you've got four versions of take-if you'd want, the inside-go and >>>>>>> outside-go versions cross product with the two when-not-wanted >>>>>>> behaviors. >>>>>>> >>>>>>> At that point, you'd probably be better off just writing a consumer >>>>>>> that splits off the pred-matching items into one out channel and feeds >>>>>>> everything else into a second channel, with your original consumer >>>>>>> taking >>>>>>> from the first of these and the others taking from the second. That gets >>>>>>> you the block until version of the behavior. The other version can be >>>>>>> had >>>>>>> by making the pred-using consumer the sole consumer of the in channel, >>>>>>> which takes a value, applies pred, and branches, on the "want" branch >>>>>>> doing >>>>>>> whatever and on the "do not want" branch putting the value onto an out >>>>>>> channel that feeds the other consumers before taking its own "do not >>>>>>> want" >>>>>>> actions. >>>>>>> >>>>>>> -- >>>>>>> You received this message because you are subscribed to the Google >>>>>>> Groups "Clojure" group. >>>>>>> To post to this group, send email to clo...@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+u...@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+u...@googlegroups.com. >>>>>>> For more options, visit https://groups.google.com/d/optout. >>>>>>> >>>>>> >>>>>> -- >>>>> You received this message because you are subscribed to the Google >>>>> Groups "Clojure" group. >>>>> To post to this group, send email to clo...@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+u...@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+u...@googlegroups.com. >>>>> For more options, visit https://groups.google.com/d/optout. >>>>> >>>> >>>> -- >>> You received this message because you are subscribed to the Google >>> Groups "Clojure" group. >>> To post to this group, send email to clo...@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+u...@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+u...@googlegroups.com. >>> For more options, visit https://groups.google.com/d/optout. >>> >> >> -- > 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/d/optout. > -- 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/d/optout.