[NAME]
ALL.misc.comparison.channel

[TITLE]
Communication Channel (Go)

[DESCRIPTION]

The main differences between Go channel and Dao channel are: 
  *  Go has syntax support for channels; But Dao doesn't;
  *  Dao channel has builtin support for timeout for both sending and receiving;  But Go 
     channel doesn't;
  *  Data receive from Dao channel has an additional attribute to indicate whether  the c
     hannel has been closed;  But Go channel doesn't support this; 


     
   1  # Go
   2  
   3  package main
   4  
   5  const N = 1000000;
   6  
   7  var c1 = make(chan int, 1)
   8  var c2 = make(chan int, 1)
   9  
  10  func Producer( ch chan int ){
  11      for index := 0; index < N; index++ {
  12          if index % 100000 == 0 { println( "sending", index ) } 
  13          ch <- index
  14      }   
  15      c1 <- 1
  16  }
  17  
  18  func Consumer( ch chan int ){
  19      println( "Consumer" )
  20      for index := 0; index < N; index++ {
  21          var data = <-ch
  22          if int(data) % 100000 == 0 { println( "received", data ) } 
  23      }   
  24      c2 <- 1
  25  }
  26  
  27  func main() {
  28      ch := make(chan int, 1)
  29  
  30      go Producer( ch )
  31      go Consumer( ch )
  32      <-c1
  33      <-c2
  34  }
     


     
   1  # Dao
   2  
   3  const N = 1000000
   4  
   5  routine Producer( chan: mt::channel<int> )
   6  {
   7      index = 0;
   8      while( ++index <= N ){
   9          if( index % 10000 == 0 ) io.writeln( "sending", index )
  10          chan.send( index )  # Or chan.send( index, 1.5 ) for a 1.5 second timeout;
  11      }   
  12      chan.cap(0)  # set channel buffer size to zero to close the channel;
  13  }
  14  
  15  routine Consumer( chan: mt::channel<int> )
  16  {
  17      while(1){
  18          data = chan.receive()  # Or chan.receive( 1.5 ) for a 1.5 second timeout;
  19          if( (int)data.data % 10000 == 0 ) io.writeln( "received", data );
  20          if( data.status == $finished ) break
  21      }   
  22  }
  23  
  24  routine main() 
  25  {
  26      chan = mt::channel<int>(1)
  27  
  28      Producer( chan ) !! 
  29      Consumer( chan ) !! 
  30  
  31      # Tasklets are automatically joined at the end of the program;
  32  }