Thanks, I should have checked the spec.

On Thu, Sep 1, 2016 at 11:14 AM Darren Hoo <darren....@gmail.com> wrote:

> I don't think so.
>
> see https://golang.org/ref/spec#Select_statements
>
> If one or more of the communications can proceed, a single one that can
> proceed is chosen via a uniform pseudo-random selection. Otherwise, if
> there is a default case, that case is chosen.
>
> So if the done channel has been sent, the first case will be selected and
> f will not be called anymore.
>
> On Friday, September 2, 2016 at 1:58:04 AM UTC+8, freeformz wrote:
>
>> I think you can still deadlock, but I'm not sure if the `default:` case
>> is considered for random selection of a select like other branches are. It
>> would just be less deterministic.
>>
>> On Thu, Sep 1, 2016 at 10:38 AM Darren Hoo <darre...@gmail.com> wrote:
>>
>>> Got it, using buffered channel works for me
>>>
>>> ints := make(chan int, 1)
>>> done := make(chan bool, 1)
>>>
>>> go func() {
>>> for i := 0; i < 100; i++ {
>>> ints <- i
>>> }
>>> close(ints)
>>> }()
>>>
>>> f := func() {
>>> j := 0
>>> for {
>>> i, ok := <-ints
>>> if !ok {
>>> done <- true
>>> return
>>> }
>>> j++
>>>
>>> fmt.Println(i)
>>>
>>> //10 ints for one batch
>>> if j == 10 {
>>> return
>>> }
>>> }
>>> }
>>>
>>> exit:
>>> for {
>>> f()
>>>
>>> select {
>>> case <-done:
>>> fmt.Println("Exiting")
>>> break exit
>>> default:
>>> //do nothing just next f()
>>> }
>>> }
>>>
>>>
>>>
>>> On Friday, September 2, 2016 at 1:30:10 AM UTC+8, freeformz wrote:
>>>
>>>> If you execute it you are told on which lines the deadlock happens...
>>>>
>>>> fatal error: all goroutines are asleep - deadlock!
>>>>
>>>> goroutine 1 [chan send]:
>>>> main.main.func2()
>>>>         /Users/emuller/go/src/github.com/freeformz/tt/main.go:25 +0xce
>>>> main.main()
>>>>         /Users/emuller/go/src/github.com/freeformz/tt/main.go:37 +0x118
>>>> exit status 2
>>>>
>>>> main.go:25 is the line that says `done <- true`.
>>>>
>>>> The `done` channel isn't buffered and the first loop through will
>>>> select that path, but there is not another goroutine selecting from done.
>>>> so f() never returns. Deadlock.
>>>>
>>>> On Thu, Sep 1, 2016 at 10:04 AM Darren Hoo <darre...@gmail.com> wrote:
>>>>
>>> var wg sync.WaitGroup
>>>>>
>>>>> ints := make(chan int, 1)
>>>>> done := make(chan bool)
>>>>>
>>>>> go func() {
>>>>> for i := 0; i < 3; i++ {
>>>>> ints <- i
>>>>> }
>>>>> close(ints)
>>>>> }()
>>>>>
>>>>> f := func() {
>>>>> wg.Add(1)
>>>>> defer wg.Done()
>>>>>
>>>>> for {
>>>>> i, ok := <-ints
>>>>> if !ok {
>>>>> done <- true
>>>>> return
>>>>> }
>>>>> }
>>>>> }
>>>>>
>>>>> exit:
>>>>> for {
>>>>> select {
>>>>> case <-done:
>>>>> break exit
>>>>> default:
>>>>> f()
>>>>> }
>>>>> }
>>>>> wg.Wait()
>>>>>
>>>>>
>>>>>
>>>>> --
>>>>> 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...@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...@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