I do not think priority select is *necessary*, it could be a nice addition 
if the performance does not change.

On Wednesday, August 28, 2019 at 8:27:36 PM UTC+2, Leo Lara wrote:
>
> Hi Robert,
>
> From the article: """To bound more the problem, in my case, you control 
> the writers but not the readers"""
>
> So what I was trying to do was to be able to close, with mutiple writers, 
> while being transparent for the readers. The readers only need to read as 
> usual form the channel.
>
> For example, if you want to write a library where the user just reads from 
> a channel, this is an approach I found where the user of the lirbary deos 
> nto have to do anything special. Of course, there might be another 
> solution, but if you need to modify the reader we are talking about a 
> different problem.
>
> Cheers!!
>
> On Wednesday, August 28, 2019 at 7:17:24 PM UTC+2, Robert Engels wrote:
>>
>> A better solution is to wrap the writes using a RWLock, grab the read 
>> lock for writing, and the Write lock for closing. Pretty simple.
>>
>> Just encapsulate it all in a MultiWriterChannel struct - generics would 
>> help here :)
>>
>> -----Original Message----- 
>> From: Leo Lara 
>> Sent: Aug 28, 2019 11:24 AM 
>> To: golang-nuts 
>> Subject: [go-nuts] Re: An old problem: lack of priority select cases 
>>
>> This is connected with my article: 
>> https://dev.to/leolara/closing-a-go-channel-written-by-several-goroutines-52j2
>>
>> I think there I show it is possible to workaround that limitation using 
>> standard Go tools. Of course, the code would be simple with priority 
>> select, but also perhaps select would become less efficient.
>>
>> On Wednesday, August 28, 2019 at 6:06:33 PM UTC+2, T L 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/b284f880-034a-4721-8686-ef48d3e2c14c%40googlegroups.com
>>  
>> <https://groups.google.com/d/msgid/golang-nuts/b284f880-034a-4721-8686-ef48d3e2c14c%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/aeb38a0a-8268-42d7-a8eb-ce5ef01c5380%40googlegroups.com.

Reply via email to