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 > <javascript:>> 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 <javascript:>. >> 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.