github.com/linapex/ethereum-go-chinese@v0.0.0-20190316121929-f8b7a73c3fa1/event/example_feed_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  //</624450090815197184>
    11  
    12  
    13  package event_test
    14  
    15  import (
    16  	"fmt"
    17  
    18  	"github.com/ethereum/go-ethereum/event"
    19  )
    20  
    21  func ExampleFeed_acknowledgedEvents() {
    22  //此示例显示如何将send的返回值用于请求/答复
    23  //活动消费者和生产者之间的互动。
    24  	var feed event.Feed
    25  	type ackedEvent struct {
    26  		i   int
    27  		ack chan<- struct{}
    28  	}
    29  
    30  //消费者等待feed上的事件并确认处理。
    31  	done := make(chan struct{})
    32  	defer close(done)
    33  	for i := 0; i < 3; i++ {
    34  		ch := make(chan ackedEvent, 100)
    35  		sub := feed.Subscribe(ch)
    36  		go func() {
    37  			defer sub.Unsubscribe()
    38  			for {
    39  				select {
    40  				case ev := <-ch:
    41  fmt.Println(ev.i) //“处理”事件
    42  					ev.ack <- struct{}{}
    43  				case <-done:
    44  					return
    45  				}
    46  			}
    47  		}()
    48  	}
    49  
    50  //生产者发送AckedEvent类型的值,增加i的值。
    51  //它在发送下一个事件之前等待所有消费者确认。
    52  	for i := 0; i < 3; i++ {
    53  		acksignal := make(chan struct{})
    54  		n := feed.Send(ackedEvent{i, acksignal})
    55  		for ack := 0; ack < n; ack++ {
    56  			<-acksignal
    57  		}
    58  	}
    59  //输出:
    60  //零
    61  //零
    62  //零
    63  //一
    64  //一
    65  //一
    66  //二
    67  //二
    68  //二
    69  }
    70