On Sunday, September 1, 2019 at 4:35:10 AM UTC-4, rog wrote: > > > > On Sat, 31 Aug 2019 at 10:02, T L <tapi...@gmail.com <javascript:>> wrote: > >> >> >> On Saturday, August 31, 2019 at 4:04:29 AM UTC-4, T L wrote: >>> >>> >>> >>> On Saturday, August 31, 2019 at 2:32:26 AM UTC-4, rog wrote: >>>> >>>> The reason you're wanting priority select is because you are shutting >>>> down the data channel preemptively, but you can wait for an >>>> acknowledgement >>>> from the run goroutine instead: >>>> >>>> https://play.golang.org/p/qSWluYy4ifl >>>> >>>> >>> Your solution is clever. The Close method can be called multiple time >>> safely. >>> Is there such a beautiful solution for multiple senders? >>> >>> >> >> Translating a multi-senders problem to a single sender problem is the >> only way I can get: >> https://play.golang.org/p/dAppUxP96g4 >> > > The answer really depends on what you're actually trying to do. What are > the multiple senders? What's the actual problem you're trying to solve? > > I'd fairly sure you'll be able do what you want without requiring a > prioritised select, which is what this thread was about. > > cheers, > rog. > > Yes, there are ways to handle the problem of uncertain number of senders, but there are no simple ways. A mechanism must be designed to avoid any sender writing to a closed channel.
> >> >>> >>>> On Wed, 28 Aug 2019 at 18:06, T L <tapi...@gmail.com> wrote: >>>> >>>>> The old thread: >>>>> https://groups.google.com/forum/#!topic/golang-nuts/ZrVIhHCrR9o >>>>> >>>>> Go channels are flexible, but in practice, I often encountered some >>>>> situations in which channel are hard to use. >>>>> Given an example: >>>>> >>>>> import "math/rand" >>>>> >>>>> type Producer struct { >>>>> data chan int >>>>> closed chan struct{} >>>>> } >>>>> >>>>> func NewProducer() *Producer { >>>>> p := &Producer { >>>>> data: make(chan int), >>>>> closed: make(chan struct{}), >>>>> } >>>>> >>>>> go p.run() >>>>> >>>>> return p >>>>> } >>>>> >>>>> func (p *Produce) Stream() chan int { >>>>> return p.data >>>>> } >>>>> >>>>> func (p *Producer) run() { >>>>> for { >>>>> // If non-blocking cases are selected by their appearance >>>>> order, >>>>> // then the following slect block is a perfect use. >>>>> select { >>>>> case(0) <-p.closed: return >>>>> case p.data <- rand.Int(): >>>>> } >>>>> } >>>>> } >>>>> >>>>> func (p *Produce) Clsoe() { >>>>> close(p.closed) >>>>> close(p.data) >>>>> } >>>>> >>>>> func main() { >>>>> p := NewProducer() >>>>> for n := p.Stream() { >>>>> // use n ... >>>>> } >>>>> } >>>>> >>>>> >>>>> If the first case in the select block in the above example has a >>>>> higher priority than the second one, >>>>> then coding will be much happier for the use cases like the above one. >>>>> >>>>> In short, the above use case requires: >>>>> * for receivers, data streaming end is notified by the close of a >>>>> channel. >>>>> * for senders, data will never be sent to closed channel. >>>>> >>>>> But, as Go 1 doesn't support priority select cases, it is much tedious >>>>> to implement the code >>>>> satisfying the above listed requirements. The final implementation is >>>>> often very ugly and inefficient. >>>>> >>>>> Does anyone else also experience the pain? >>>>> >>>>> -- >>>>> You received this message because you are subscribed to the Google >>>>> Groups "golang-nuts" group. >>>>> To unsubscribe from this group and stop receiving emails from it, send >>>>> an email to golan...@googlegroups.com. >>>>> To view this discussion on the web visit >>>>> https://groups.google.com/d/msgid/golang-nuts/e3015cd8-c2ec-479e-927d-b9ad762d277e%40googlegroups.com >>>>> >>>>> <https://groups.google.com/d/msgid/golang-nuts/e3015cd8-c2ec-479e-927d-b9ad762d277e%40googlegroups.com?utm_medium=email&utm_source=footer> >>>>> . >>>>> >>>> -- >> You received this message because you are subscribed to the Google Groups >> "golang-nuts" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to golan...@googlegroups.com <javascript:>. >> To view this discussion on the web visit >> https://groups.google.com/d/msgid/golang-nuts/e239c78f-61fc-4238-aa5d-f776cb9aec03%40googlegroups.com >> >> <https://groups.google.com/d/msgid/golang-nuts/e239c78f-61fc-4238-aa5d-f776cb9aec03%40googlegroups.com?utm_medium=email&utm_source=footer> >> . >> > -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/golang-nuts/432f9d63-5223-4119-b7e7-b1eb2dd57cdc%40googlegroups.com.