github.com/linapex/ethereum-go-chinese@v0.0.0-20190316121929-f8b7a73c3fa1/event/example_scope_test.go (about) 1 2 //<developer> 3 // <name>linapex 曹一峰</name> 4 // <email>linapex@163.com</email> 5 // <wx>superexc</wx> 6 // <qqgroup>128148617</qqgroup> 7 // <url>https://jsq.ink</url> 8 // <role>pku engineer</role> 9 // <date>2019-03-16 19:16:38</date> 10 //</624450090852945920> 11 12 13 package event_test 14 15 import ( 16 "fmt" 17 "sync" 18 19 "github.com/ethereum/go-ethereum/event" 20 ) 21 22 //此示例演示如何使用subscriptionScope来控制 23 //订阅。 24 // 25 //我们的示例程序由两个服务器组成,每个服务器在 26 //请求。服务器还允许订阅所有计算的结果。 27 type divServer struct{ results event.Feed } 28 type mulServer struct{ results event.Feed } 29 30 func (s *divServer) do(a, b int) int { 31 r := a / b 32 s.results.Send(r) 33 return r 34 } 35 36 func (s *mulServer) do(a, b int) int { 37 r := a * b 38 s.results.Send(r) 39 return r 40 } 41 42 //The servers are contained in an App. The app controls the servers and exposes them 43 //通过它的API。 44 type App struct { 45 divServer 46 mulServer 47 scope event.SubscriptionScope 48 } 49 50 func (s *App) Calc(op byte, a, b int) int { 51 switch op { 52 case '/': 53 return s.divServer.do(a, b) 54 case '*': 55 return s.mulServer.do(a, b) 56 default: 57 panic("invalid op") 58 } 59 } 60 61 //应用程序的subscripresults方法开始将计算结果发送给给定的 62 //通道。通过此方法创建的订阅与应用程序的生存期绑定。 63 //因为它们是在作用域中注册的。 64 func (s *App) SubscribeResults(op byte, ch chan<- int) event.Subscription { 65 switch op { 66 case '/': 67 return s.scope.Track(s.divServer.results.Subscribe(ch)) 68 case '*': 69 return s.scope.Track(s.mulServer.results.Subscribe(ch)) 70 default: 71 panic("invalid op") 72 } 73 } 74 75 //stop停止应用程序,关闭通过subscripresults创建的所有订阅。 76 func (s *App) Stop() { 77 s.scope.Close() 78 } 79 80 func ExampleSubscriptionScope() { 81 //创建应用程序。 82 var ( 83 app App 84 wg sync.WaitGroup 85 divs = make(chan int) 86 muls = make(chan int) 87 ) 88 89 //在后台运行订阅服务器。 90 divsub := app.SubscribeResults('/', divs) 91 mulsub := app.SubscribeResults('*', muls) 92 wg.Add(1) 93 go func() { 94 defer wg.Done() 95 defer fmt.Println("subscriber exited") 96 defer divsub.Unsubscribe() 97 defer mulsub.Unsubscribe() 98 for { 99 select { 100 case result := <-divs: 101 fmt.Println("division happened:", result) 102 case result := <-muls: 103 fmt.Println("multiplication happened:", result) 104 case <-divsub.Err(): 105 return 106 case <-mulsub.Err(): 107 return 108 } 109 } 110 }() 111 112 //与应用程序交互。 113 app.Calc('/', 22, 11) 114 app.Calc('*', 3, 4) 115 116 //停止应用程序。这将关闭订阅,导致订阅服务器退出。 117 app.Stop() 118 wg.Wait() 119 120 //输出: 121 //分部发生:2 122 //发生乘法:12 123 //已退出订阅服务器 124 } 125