You still are not understanding  proper concurrent design. Priority select 
cases do not matter in the case of asynchronous external events. 

> On Oct 4, 2019, at 1:46 PM, T L <tapir....@gmail.com> wrote:
> 
> 
> I just found an example in the "context" package docs:
> 
>     //  // Stream generates values with DoSomething and sends them to out
>     //  // until DoSomething returns an error or ctx.Done is closed.
>     //  func Stream(ctx context.Context, out chan<- Value) error {
>     //        for {
>     //                v, err := DoSomething(ctx)
>     //                if err != nil {
>     //                        return err
>     //                }
>     //                select {
>     //                case <-ctx.Done():
>     //                        return ctx.Err()
>     //                case out <- v:
>     //                }
>     //        }
>     //  }
> 
> It looks the send "out <- v" still has a possibility to be executed,
> even if "ctx.Done()" is closed.
> But if Go supports select case priority, then this will never happen.
> 
> 
>> On Wednesday, August 28, 2019 at 12:06:33 PM UTC-4, 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 golang-nuts+unsubscr...@googlegroups.com.
> To view this discussion on the web visit 
> https://groups.google.com/d/msgid/golang-nuts/b7a14153-253e-43c4-bda5-96079601465f%40googlegroups.com.

-- 
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/5DB82954-56D2-455F-ADF4-02B845D52783%40ix.netcom.com.

Reply via email to