On Wednesday, August 28, 2019 at 1:49:51 PM UTC-4, Robert Engels wrote: > > As I said in another email, using a RWMutex makes the multiple senders > problem easily solvable. Grab the Read lock when writing, and the Write > lock when closing. Set a 'closed' flag during Close that is checked during > the write. >
Could you show a piece of code for easily understanding? > > -----Original Message----- > From: T L > Sent: Aug 28, 2019 12:37 PM > To: golang-nuts > Subject: Re: [go-nuts] An old problem: lack of priority select cases > > > > On Wednesday, August 28, 2019 at 1:12:10 PM UTC-4, Robert Engels wrote: >> >> And what I was trying to say is that request is inherently racy. >> >> You can already do priority selects. see >> https://play.golang.org/p/58FfsKIivSr as a way to do it - more realistic >> though to use buffered channels. Pretty easy to wrap this in a function >> that takes N channels. >> > > This is not the priority I expected. Could you make an example based on my > code in the first comment? so that I can understand it easily. > In fact, I have verbose version which doesn't need priority select cases. > It is an acceptable solution. But there are many other more complex cases, > such as multiple senders. > I haven't found an acceptable solution for such complex cases. > > import "math/rand" > > type Producer struct { > data chan int > closing chan struct{} > canSafeClose chan struct{} > } > > func NewProducer() *Producer { > p := &Producer { > data: make(chan int), > closing: make(chan struct{}), > canSafeClose: make(chan struct{}), > } > > go p.run() > > return p > } > > func (p *Produce) Stream() chan int { > return p.data > } > > func (p *Producer) run() { > for { > select { > case <-p.closing: > close(p.canSafeClose) > return > default: > } > > select { > case <-p.closing: > close(p.canSafeClose) > return > case p.data <- rand.Int(): > } > } > } > > func (p *Producer) Close() { > close(p.closed) > <-p.canSafeClose > close(p.data) > } > > func main() { > p := NewProducer() > for n := p.Stream() { > // use n ... > } > } > > >> -----Original Message----- >> From: T L >> Sent: Aug 28, 2019 11:43 AM >> To: golang-nuts >> Subject: Re: [go-nuts] An old problem: lack of priority select cases >> >> >> >> On Wednesday, August 28, 2019 at 12:36:56 PM UTC-4, Robert Engels wrote: >>> >>> That's inherently racy - since between when the runtime determines the >>> channel is OK for writing, another routine can close the channel before the >>> write is attempted - so "priorities" won't help. >>> >> >> I understand this. What I mean is it would be great to support priority >> select cases. >> >>> >>> -----Original Message----- >>> From: T L >>> Sent: Aug 28, 2019 11:06 AM >>> To: golang-nuts >>> Subject: [go-nuts] An old problem: lack of priority select cases >>> >>> 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. >> To view this discussion on the web visit >> https://groups.google.com/d/msgid/golang-nuts/0f753567-eaa8-4d1d-9db1-a3f382f59216%40googlegroups.com >> >> <https://groups.google.com/d/msgid/golang-nuts/0f753567-eaa8-4d1d-9db1-a3f382f59216%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/e8e6ceff-1a3e-4c69-93cc-4f5013a3e3c3%40googlegroups.com > > <https://groups.google.com/d/msgid/golang-nuts/e8e6ceff-1a3e-4c69-93cc-4f5013a3e3c3%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/2f9acd65-682a-45e1-bdd8-ba4036792d68%40googlegroups.com.