> I don't believe the actual use case described can be mapped. From what I 
> understand, the intended behavior was

> a) put the goroutine to sleep until some communication can proceed

> b) if exactly one communication can proceed, do it

> c) if multiple communications can proceed, choose the one with the highest 
> priority

 

How about:

 

        select {

        case <-priorityHigh:

                ...

        default:

                select {

                case <-priorityLow:

                        ...

                default:

                        select {

                        case <- priorityHigh:

                                ...

                        case <- priorityLow:

                                ...

                        case <- priorityLowest:

                                ...

                        }

                }

        }

John

    John Souvestre - New Orleans LA

 

From: 'Axel Wagner' via golang-nuts [mailto:golang-nuts@googlegroups.com] 
Sent: 2017 January 25, Wed 10:00
To: Egon
Cc: golang-nuts
Subject: Re: [go-nuts] Re: Priority cases in select?

 

I don't believe the actual use case described can be mapped. From what I 
understand, the intended behavior was

a) put the goroutine to sleep until some communication can proceed

b) if exactly one communication can proceed, do it

c) if multiple communications can proceed, choose the one with the highest 
priority

 

The suggested solutions (or any I can think of) violate at least one of these. 
They either wait busily, violating a, or they try to communicate in 
priority-order, then, as a last resort, block on any particular case, violating 
b, or they fall back to a regular select, violating c.

 

I don't know enough about how select is implemented to pass any judgement on 
whether this can be efficiently implemented, but I'm also not sure it's such a 
great idea. Choosing a case uniformly at random was a deliberate design 
decision to prevent starvation. There is a certain danger in people not 
realizing that they become susceptible to starvation if they do this. It's also 
a feature rabbit-hole 
<https://commandcenter.blogspot.ch/2012/06/less-is-exponentially-more.html> . 
I'd predict, that next up, someone who experiences starvation wants to add 
weighted scheduling ("give this case an 80% chance of succeeding and this other 
case 20%, so that eventually either will proceed") or more complicated 
scheduling strategies.

 

I think such edge-cases for scheduling requirements should rather be 
implemented separately in a library. Yes, it's complicated code, but that's all 
the more reason why it shouldn't be in everyone's go runtime.

 

On Wed, Jan 25, 2017 at 4:23 PM, Egon <egonel...@gmail.com> wrote:

On Wednesday, 25 January 2017 15:14:27 UTC+2, T L wrote:

sometimes, I do want one case on a select block get selected even if there are 
multiple unblocked cases.
For example, I don't want the dataCh case is selected if the stopCh and the 
timer channel are unblocked:

select {
case <- stopCh:
    return
case value := <-dataCh:
}

select {
case <- time.After(time.Second):
    return
case dataCh <- value:
}

Is there a solution to satisfy my need currently?

 

type poller func() bool

var pollers []poller

 

pollers = append(pollers, func() bool {

select {

case <-priority:

// ...

default:

return false

}

return true

})

 

for {

for _, p := range pollers {

if p() {

break

}

}

}

-- 
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.
For more options, visit https://groups.google.com/d/optout.

 

-- 
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.
For more options, visit https://groups.google.com/d/optout.

-- 
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.
For more options, visit https://groups.google.com/d/optout.

Reply via email to