github.com/graybobo/golang.org-package-offline-cache@v0.0.0-20200626051047-6608995c132f/x/talks/2013/distsys/addr3.go (about)

     1  // +build OMIT
     2  
     3  package main
     4  
     5  import (
     6  	"fmt"
     7  	"math/rand"
     8  	"sync"
     9  	"time"
    10  )
    11  
    12  func lookup() {
    13  	var group sync.WaitGroup
    14  
    15  	for _, w := range worklist {
    16  		group.Add(1)
    17  		go func(w *Work) {
    18  			w.addrs, w.err = LookupHost(w.host)
    19  			group.Done()
    20  		}(w)
    21  	}
    22  
    23  	group.Wait()
    24  }
    25  
    26  func main() {
    27  	rand.Seed(time.Now().UnixNano())
    28  
    29  	t0 := time.Now()
    30  	lookup()
    31  
    32  	fmt.Printf("\n")
    33  	for _, w := range worklist {
    34  		if w.err != nil {
    35  			fmt.Printf("%s: error: %v\n", w.host, w.err)
    36  			continue
    37  		}
    38  		fmt.Printf("%s: %v\n", w.host, w.addrs)
    39  	}
    40  	fmt.Printf("total lookup time: %.3f seconds\n", time.Since(t0).Seconds())
    41  }
    42  
    43  var worklist = []*Work{
    44  	{host: "fast.com"},
    45  	{host: "slow.com"},
    46  	{host: "fast.missing.com"},
    47  	{host: "slow.missing.com"},
    48  }
    49  
    50  type Work struct {
    51  	host  string
    52  	addrs []string
    53  	err   error
    54  }
    55  
    56  func LookupHost(name string) (addrs []string, err error) {
    57  	t0 := time.Now()
    58  	defer func() {
    59  		fmt.Printf("lookup %s: %.3f seconds\n", name, time.Since(t0).Seconds())
    60  	}()
    61  	h := hosts[name]
    62  	if h == nil {
    63  		h = failure
    64  	}
    65  	return h(name)
    66  }
    67  
    68  type resolver func(string) ([]string, error)
    69  
    70  var hosts = map[string]resolver{
    71  	"fast.com":         delay(10*time.Millisecond, fixedAddrs("10.0.0.1")),
    72  	"slow.com":         delay(2*time.Second, fixedAddrs("10.0.0.4")),
    73  	"fast.missing.com": delay(10*time.Millisecond, failure),
    74  	"slow.missing.com": delay(2*time.Second, failure),
    75  }
    76  
    77  func fixedAddrs(addrs ...string) resolver {
    78  	return func(string) ([]string, error) {
    79  		return addrs, nil
    80  	}
    81  }
    82  
    83  func delay(d time.Duration, f resolver) resolver {
    84  	return func(name string) ([]string, error) {
    85  		time.Sleep(d/2 + time.Duration(rand.Int63n(int64(d/2))))
    86  		return f(name)
    87  	}
    88  }
    89  
    90  func failure(name string) ([]string, error) {
    91  	return nil, fmt.Errorf("unknown host %v", name)
    92  }