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  }