Robert,
it seems to me that you have a clear understanding about unbuffered vs.
buffered channels. I feel unbuffered channels are safer to use especially
in an acyclic directed graph of flowing values. Buffered channels seem to
reduce blocking but I feel they come with the cost of such side effects
like my initial problem of forgotten results in their channels. I would
love to hear/read/see more on the unbuffered vs. buffered tradeoff to get
rid of this gut feeling I am currently based on :-). Any good article you
can point me to?
Thanks

Robert Engels <reng...@ix.netcom.com> schrieb am Di. 18. Dez. 2018 um 17:03:

> That code is incorrect as well when using buffered channels.
>
> On Dec 18, 2018, at 10:00 AM, Skip Tavakkolian <skip.tavakkol...@gmail.com>
> wrote:
>
> why not just  drop the select? i think the following is guaranteed because
> putting things on rc has to succeed before putting true into dc:
>
> package main
>
> import (
> "fmt"
> )
>
> func do(i int, rc chan<- int, dc chan<- bool) {
> rc <- i
> dc <- true
> }
>
> func main() {
> worker := 10
> rc := make(chan int, worker)
> done := 0
> dc := make(chan bool, worker)
> for i := 0; i < worker; i++ {
> go do(i, rc, dc)
> }
> for done < worker {
> r := <-rc
> fmt.Println(r)
> <-dc
> done++
> }
> }
>
>
> On Tue, Dec 18, 2018 at 5:35 AM Chris Burkert <burkert.ch...@gmail.com>
> wrote:
>
>> Dear all,
>>
>> I have a couple of goroutines sending multiple results over a channel - a
>> simple fan-in. They signal the completion on a done channel. Main selects
>> on the results and done channel in parallel. As the select is random main
>> sometimes misses to select the last result. What would be the idiomatic way
>> to prevent this and completely drain the result channel?
>>
>> Here is a minmal example which sometimes prints one 0 but should always
>> print two of them:
>>
>> package main
>>
>> import (
>>         "fmt"
>> )
>>
>> func do(rc chan<- int, dc chan<- bool) {
>>         rc <- 0
>>         dc <- true
>> }
>>
>> func main() {
>>         worker := 2
>>         rc := make(chan int, worker)
>>         done := 0
>>         dc := make(chan bool, worker)
>>         for i := 0; i < worker; i++ {
>>                 go do(rc, dc)
>>         }
>>         for done < worker {
>>                 select {
>>                 case <-dc:
>>                         done++
>>                 case r := <-rc:
>>                         fmt.Println(r)
>>                 }
>>         }
>> }
>>
>> many thanks
>> Chris
>>
>> --
>> 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