github.com/weedge/lib@v0.0.0-20230424045628-a36dcc1d90e4/client/etcd/dlock/example_test.go (about) 1 package dlock 2 3 import ( 4 "context" 5 "fmt" 6 "sync" 7 "time" 8 9 "go.etcd.io/etcd/client/v3" 10 "go.etcd.io/etcd/client/v3/concurrency" 11 12 "github.com/weedge/lib/log" 13 ) 14 15 func Example_Lock() { 16 cli, err := clientv3.New(clientv3.Config{ 17 Endpoints: []string{"localhost:2379"}, 18 DialTimeout: 5 * time.Second, 19 }) 20 if err != nil { 21 log.Error(err) 22 } 23 defer cli.Close() 24 25 lockKey := "/lock" 26 27 wg := &sync.WaitGroup{} 28 wg.Add(2) 29 go func() { 30 defer wg.Done() 31 session, err := concurrency.NewSession(cli) 32 if err != nil { 33 log.Error(err) 34 } 35 defer session.Close() 36 m := concurrency.NewMutex(session, lockKey) 37 if err := m.Lock(context.TODO()); err != nil { 38 log.Error("go1 get mutex failed " + err.Error()) 39 } 40 println(fmt.Sprintf("go1 get mutex sucess")) 41 println(fmt.Sprintf("%+v", m)) 42 time.Sleep(time.Duration(10) * time.Second) 43 m.Unlock(context.TODO()) 44 println("go1 release lock") 45 }() 46 47 go func() { 48 defer wg.Done() 49 session, err := concurrency.NewSession(cli) 50 if err != nil { 51 log.Error(err) 52 } 53 m := concurrency.NewMutex(session, lockKey) 54 if err := m.Lock(context.TODO()); err != nil { 55 log.Error("go2 get mutex failed " + err.Error()) 56 } 57 println("go2 get mutex success") 58 println(fmt.Sprintf("%+v", m)) 59 time.Sleep(time.Duration(2) * time.Second) 60 m.Unlock(context.TODO()) 61 println("go2 release lock") 62 }() 63 64 wg.Wait() 65 66 println("over") 67 // Output: 68 // 69 } 70 71 func Example_TryLock() { 72 cli, err := clientv3.New(clientv3.Config{ 73 Endpoints: []string{"localhost:2379"}, 74 DialTimeout: 5 * time.Second, 75 }) 76 if err != nil { 77 log.Error(err) 78 } 79 defer cli.Close() 80 81 lockKey := "/lock" 82 83 wg := &sync.WaitGroup{} 84 wg.Add(2) 85 86 // tryLock 87 go func() { 88 defer wg.Done() 89 session, err := concurrency.NewSession(cli) 90 if err != nil { 91 log.Error(err) 92 } 93 defer session.Close() 94 m := concurrency.NewMutex(session, lockKey) 95 err1 := m.TryLock(context.TODO()) 96 if err1 != nil { 97 println("cannot acquire lock for go3, as already locked in another session", err1.Error()) 98 } else { 99 println("go3 get mutex success") 100 println(fmt.Sprintf("%+v", m)) 101 time.Sleep(time.Duration(2) * time.Second) 102 m.Unlock(context.TODO()) 103 println("sleep 2s go3 release lock") 104 } 105 }() 106 107 // tryLock 108 go func() { 109 defer wg.Done() 110 session, err := concurrency.NewSession(cli) 111 if err != nil { 112 log.Error(err) 113 } 114 defer session.Close() 115 m := concurrency.NewMutex(session, lockKey) 116 err1 := m.TryLock(context.TODO()) 117 if err1 != nil { 118 println("cannot acquire lock for go4, as already locked in another session", err1.Error()) 119 } else { 120 println("go4 get mutex success") 121 println(fmt.Sprintf("%+v", m)) 122 time.Sleep(time.Duration(2) * time.Second) 123 m.Unlock(context.TODO()) 124 println("sleep 2s go4 release lock") 125 } 126 }() 127 128 wg.Wait() 129 130 println("over") 131 // Output: 132 // 133 }