github.com/yinchengtsinghua/golang-Eos-dpos-Ethereum@v0.0.0-20190121132951-92cc4225ed8e/event/example_scope_test.go (about)

     1  
     2  //此源码被清华学神尹成大魔王专业翻译分析并修改
     3  //尹成QQ77025077
     4  //尹成微信18510341407
     5  //尹成所在QQ群721929980
     6  //尹成邮箱 yinc13@mails.tsinghua.edu.cn
     7  //尹成毕业于清华大学,微软区块链领域全球最有价值专家
     8  //https://mvp.microsoft.com/zh-cn/PublicProfile/4033620
     9  //版权所有2016 Go Ethereum作者
    10  //此文件是Go以太坊库的一部分。
    11  //
    12  //Go-Ethereum库是免费软件:您可以重新分发它和/或修改
    13  //根据GNU发布的较低通用公共许可证的条款
    14  //自由软件基金会,或者许可证的第3版,或者
    15  //(由您选择)任何更高版本。
    16  //
    17  //Go以太坊图书馆的发行目的是希望它会有用,
    18  //但没有任何保证;甚至没有
    19  //适销性或特定用途的适用性。见
    20  //GNU较低的通用公共许可证,了解更多详细信息。
    21  //
    22  //你应该收到一份GNU较低级别的公共许可证副本
    23  //以及Go以太坊图书馆。如果没有,请参见<http://www.gnu.org/licenses/>。
    24  
    25  package event_test
    26  
    27  import (
    28  	"fmt"
    29  	"sync"
    30  
    31  	"github.com/ethereum/go-ethereum/event"
    32  )
    33  
    34  //此示例演示如何使用subscriptionScope来控制
    35  //订阅。
    36  //
    37  //我们的示例程序由两个服务器组成,每个服务器在
    38  //请求。服务器还允许订阅所有计算的结果。
    39  type divServer struct{ results event.Feed }
    40  type mulServer struct{ results event.Feed }
    41  
    42  func (s *divServer) do(a, b int) int {
    43  	r := a / b
    44  	s.results.Send(r)
    45  	return r
    46  }
    47  
    48  func (s *mulServer) do(a, b int) int {
    49  	r := a * b
    50  	s.results.Send(r)
    51  	return r
    52  }
    53  
    54  //服务器包含在应用程序中。应用程序控制服务器并公开它们
    55  //通过它的API。
    56  type App struct {
    57  	divServer
    58  	mulServer
    59  	scope event.SubscriptionScope
    60  }
    61  
    62  func (s *App) Calc(op byte, a, b int) int {
    63  	switch op {
    64  	case '/':
    65  		return s.divServer.do(a, b)
    66  	case '*':
    67  		return s.mulServer.do(a, b)
    68  	default:
    69  		panic("invalid op")
    70  	}
    71  }
    72  
    73  //应用程序的subscripresults方法开始将计算结果发送给给定的
    74  //通道。通过此方法创建的订阅与应用程序的生存期绑定。
    75  //因为它们是在作用域中注册的。
    76  func (s *App) SubscribeResults(op byte, ch chan<- int) event.Subscription {
    77  	switch op {
    78  	case '/':
    79  		return s.scope.Track(s.divServer.results.Subscribe(ch))
    80  	case '*':
    81  		return s.scope.Track(s.mulServer.results.Subscribe(ch))
    82  	default:
    83  		panic("invalid op")
    84  	}
    85  }
    86  
    87  //stop停止应用程序,关闭通过subscripresults创建的所有订阅。
    88  func (s *App) Stop() {
    89  	s.scope.Close()
    90  }
    91  
    92  func ExampleSubscriptionScope() {
    93  //创建应用程序。
    94  	var (
    95  		app  App
    96  		wg   sync.WaitGroup
    97  		divs = make(chan int)
    98  		muls = make(chan int)
    99  	)
   100  
   101  //在后台运行订阅服务器。
   102  	divsub := app.SubscribeResults('/', divs)
   103  	mulsub := app.SubscribeResults('*', muls)
   104  	wg.Add(1)
   105  	go func() {
   106  		defer wg.Done()
   107  		defer fmt.Println("subscriber exited")
   108  		defer divsub.Unsubscribe()
   109  		defer mulsub.Unsubscribe()
   110  		for {
   111  			select {
   112  			case result := <-divs:
   113  				fmt.Println("division happened:", result)
   114  			case result := <-muls:
   115  				fmt.Println("multiplication happened:", result)
   116  			case <-divsub.Err():
   117  				return
   118  			case <-mulsub.Err():
   119  				return
   120  			}
   121  		}
   122  	}()
   123  
   124  //与应用程序交互。
   125  	app.Calc('/', 22, 11)
   126  	app.Calc('*', 3, 4)
   127  
   128  //停止应用程序。这将关闭订阅,导致订阅服务器退出。
   129  	app.Stop()
   130  	wg.Wait()
   131  
   132  //输出:
   133  //分部发生:2
   134  //发生乘法:12
   135  //已退出订阅服务器
   136  }