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 }