github.com/qiuhoude/go-web@v0.0.0-20220223060959-ab545e78f20d/prepare/18channeluse/eapache/main.go (about)

     1  package main
     2  
     3  import (
     4  	"fmt"
     5  	"github.com/eapache/channels"
     6  )
     7  
     8  /*
     9  
    10  
    11  
    12  同时对上面的四个函数还提供了WeakXXX的函数,输入关闭后不会关闭输出。
    13  
    14  */
    15  //Distribute: 从输入channel读取值,发送到其中一个输出channel中。当输入channel关闭后,输出channel都被关闭
    16  func testDist() {
    17  	fmt.Println("dist:")
    18  	a := channels.NewNativeChannel(channels.None)
    19  	outputs := []channels.Channel{
    20  		channels.NewNativeChannel(channels.None),
    21  		channels.NewNativeChannel(channels.None),
    22  		channels.NewNativeChannel(channels.None),
    23  		channels.NewNativeChannel(channels.None),
    24  	}
    25  
    26  	channels.Distribute(a, outputs[0], outputs[1], outputs[2], outputs[3])
    27  	//channels.WeakDistribute(a, outputs[0], outputs[1], outputs[2], outputs[3])
    28  
    29  	go func() {
    30  		for i := 0; i < 5; i++ {
    31  			a.In() <- i
    32  		}
    33  		a.Close()
    34  	}()
    35  	for i := 0; i < 6; i++ {
    36  		var v interface{}
    37  		var j int
    38  		select {
    39  		case v = <-outputs[0].Out():
    40  			j = 0
    41  		case v = <-outputs[1].Out():
    42  			j = 1
    43  		case v = <-outputs[2].Out():
    44  			j = 2
    45  		case v = <-outputs[3].Out():
    46  			j = 3
    47  		}
    48  		fmt.Printf("channel#%d: %d\n", j, v)
    49  	}
    50  }
    51  
    52  // Tee: 从输入channel读取值,发送到所有的输出channel中。当输入channel关闭后,输出channel都被关闭
    53  func testTee() {
    54  	fmt.Println("tee:")
    55  	a := channels.NewNativeChannel(channels.None)
    56  	outputs := []channels.Channel{
    57  		channels.NewNativeChannel(channels.None),
    58  		channels.NewNativeChannel(channels.None),
    59  		channels.NewNativeChannel(channels.None),
    60  		channels.NewNativeChannel(channels.None),
    61  	}
    62  	channels.Tee(a, outputs[0], outputs[1], outputs[2], outputs[3])
    63  	//channels.WeakTee(a, outputs[0], outputs[1], outputs[2], outputs[3])
    64  	go func() {
    65  		for i := 0; i < 5; i++ {
    66  			a.In() <- i
    67  		}
    68  		a.Close()
    69  	}()
    70  	for i := 0; i < 20; i++ {
    71  		var v interface{}
    72  		var j int
    73  		select {
    74  		case v = <-outputs[0].Out():
    75  			j = 0
    76  		case v = <-outputs[1].Out():
    77  			j = 1
    78  		case v = <-outputs[2].Out():
    79  			j = 2
    80  		case v = <-outputs[3].Out():
    81  			j = 3
    82  		}
    83  		fmt.Printf("channel#%d: %d\n", j, v)
    84  	}
    85  }
    86  
    87  //Multiplex: 合并输入channel为一个输出channel, 当所有的输入都关闭后,输出才关闭
    88  func testMulti() {
    89  	fmt.Println("multi:")
    90  	a := channels.NewNativeChannel(channels.None)
    91  	inputs := []channels.Channel{
    92  		channels.NewNativeChannel(channels.None),
    93  		channels.NewNativeChannel(channels.None),
    94  		channels.NewNativeChannel(channels.None),
    95  		channels.NewNativeChannel(channels.None),
    96  	}
    97  	channels.Multiplex(a, inputs[0], inputs[1], inputs[2], inputs[3])
    98  	//channels.WeakMultiplex(a, inputs[0], inputs[1], inputs[2], inputs[3])
    99  	go func() {
   100  		for i := 0; i < 5; i++ {
   101  			for j := range inputs {
   102  				inputs[j].In() <- i
   103  			}
   104  		}
   105  		for i := range inputs {
   106  			inputs[i].Close()
   107  		}
   108  	}()
   109  	for v := range a.Out() {
   110  		fmt.Printf("%d ", v)
   111  	}
   112  }
   113  
   114  //Pipe: 将两个channel串起来
   115  func testPipe() {
   116  	fmt.Println("pipe:")
   117  	a := channels.NewNativeChannel(channels.None)
   118  	b := channels.NewNativeChannel(channels.None)
   119  	channels.Pipe(a, b)
   120  	// channels.WeakPipe(a, b)
   121  	go func() {
   122  		for i := 0; i < 5; i++ {
   123  			a.In() <- i
   124  		}
   125  		a.Close()
   126  	}()
   127  	for v := range b.Out() {
   128  		fmt.Printf("%d ", v)
   129  	}
   130  }
   131  
   132  func main() {
   133  	testPipe()
   134  	testDist()
   135  	testTee()
   136  	testMulti()
   137  }