github.com/graybobo/golang.org-package-offline-cache@v0.0.0-20200626051047-6608995c132f/x/talks/2013/distsys/addr2.go (about) 1 // +build OMIT 2 3 package main 4 5 import ( 6 "fmt" 7 "math/rand" 8 "time" 9 ) 10 11 func lookup() { 12 done := make(chan bool, len(worklist)) 13 14 for _, w := range worklist { 15 go func(w *Work) { 16 w.addrs, w.err = LookupHost(w.host) 17 done <- true 18 }(w) 19 } 20 21 for i := 0; i < len(worklist); i++ { 22 <-done 23 } 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 }