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