Since there are multiple results needed to be processed ...

> On Dec 18, 2018, at 10:02 AM, Robert Engels <reng...@ix.netcom.com> wrote:
> 
> 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.

-- 
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