1
0
mirror of https://github.com/duke-git/lancet.git synced 2026-02-15 10:12:29 +08:00

feat: add example for keyed_locker

This commit is contained in:
dudaodong
2025-04-27 19:44:15 +08:00
parent 47e82aad39
commit f7ada6093c
3 changed files with 219 additions and 61 deletions

View File

@@ -3,6 +3,7 @@ package concurrency
import ( import (
"context" "context"
"fmt" "fmt"
"log"
"time" "time"
) )
@@ -199,3 +200,160 @@ func ExampleChannel_Bridge() {
// true // true
// true // true
} }
func ExampleKeyedLocker_Do() {
locker := NewKeyedLocker[string](2 * time.Second)
task := func() {
fmt.Println("Executing task...")
time.Sleep(1 * time.Second)
fmt.Println("Task completed.")
}
ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
defer cancel()
if err := locker.Do(ctx, "mykey", task); err != nil {
log.Fatalf("Error executing task: %v\n", err)
} else {
fmt.Println("Task successfully executed.")
}
// 再次尝试获取同一把锁,任务会被阻塞,直到释放锁
ctx2, cancel2 := context.WithTimeout(context.Background(), 3*time.Second)
defer cancel2()
if err := locker.Do(ctx2, "mykey", task); err != nil {
log.Fatalf("Error executing task: %v\n", err)
} else {
fmt.Println("Task successfully executed.")
}
// Output:
// Executing task...
// Task completed.
// Task successfully executed.
// Executing task...
// Task completed.
// Task successfully executed.
}
func ExampleRWKeyedLocker_Lock() {
locker := NewRWKeyedLocker[string](2 * time.Second)
// Simulate a key
key := "resource_key"
fn := func() {
fmt.Println("Starting write operation...")
// Simulate write operation, assuming it takes 2 seconds
time.Sleep(200 * time.Millisecond)
fmt.Println("Write operation completed!")
}
// Acquire the write lock and execute the operation
ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second)
defer cancel()
// Execute the lock operation with a 3-second timeout
err := locker.Lock(ctx, key, fn)
if err != nil {
return
}
//output:
//Starting write operation...
//Write operation completed!
}
func ExampleRWKeyedLocker_RLock() {
locker := NewRWKeyedLocker[string](2 * time.Second)
// Simulate a key
key := "resource_key"
fn := func() {
fmt.Println("Starting write operation...")
// Simulate write operation, assuming it takes 2 seconds
time.Sleep(200 * time.Millisecond)
fmt.Println("Write operation completed!")
}
// Acquire the write lock and execute the operation
ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second)
defer cancel()
// Execute the lock operation with a 3-second timeout
err := locker.RLock(ctx, key, fn)
if err != nil {
return
}
//output:
//Starting write operation...
//Write operation completed!
}
func ExampleTryKeyedLocker() {
locker := NewTryKeyedLocker[string]()
key := "resource_key"
if locker.TryLock(key) {
fmt.Println("Lock acquired")
time.Sleep(1 * time.Second)
// Unlock after work is done
locker.Unlock(key)
fmt.Println("Lock released")
} else {
fmt.Println("Lock failed")
}
//output:
//Lock acquired
//Lock released
}
func ExampleTryKeyedLocker_TryLock() {
locker := NewTryKeyedLocker[string]()
key := "resource_key"
done := make(chan struct{})
go func() {
if locker.TryLock(key) {
time.Sleep(2 * time.Second)
locker.Unlock(key)
}
close(done)
}()
time.Sleep(100 * time.Millisecond)
if locker.TryLock(key) {
fmt.Println("Lock acquired")
locker.Unlock(key)
} else {
fmt.Println("Lock failed")
}
// wait for the goroutine to finish
<-done
fmt.Println("Retrying...")
time.Sleep(100 * time.Millisecond)
if locker.TryLock(key) {
fmt.Println("Lock acquired")
locker.Unlock(key)
fmt.Println("Lock released")
} else {
fmt.Println("Lock failed")
}
// Output:
// Lock failed
// Retrying...
// Lock acquired
// Lock released
}

View File

@@ -1,51 +1,51 @@
-----BEGIN rsa private key----- -----BEGIN rsa private key-----
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
-----END rsa private key----- -----END rsa private key-----

View File

@@ -1,14 +1,14 @@
-----BEGIN rsa public key----- -----BEGIN rsa public key-----
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAoJVrCBR3dJsdj0Gg9tlk MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA36S1XbDH0Hv2xkxzyVRX
ToGvywJnJqVWBPgjnS+Hn5Ksxk1yzBieL0aQ84hVXYt0yhCgiDl/eDmgdawqUZ5j ye3O4SBbSRpjq4DFfukkqBM9YDk0JjBjjyYM2678mCRrH6tgDrMBl3GnJp2dufbi
2PhFBDahjvBnchY2ViZXNE61ya3YPEPIwUsZ1Wsmzu5cX6gA1HqE2nx8iZlJQcbG SaCLxYlodGExlWJrY0wRwGBtQHsJE4+wfxtGcjCoGyqCgAw4/fOYSlx3ECBm/mXi
/rdoxyebhdvUj6iGGvgskggkVYvDYuct+iRekfHMxG3ON+wJ31AC2+0B6w6vgvt1 xPNzn0inGTYQ0JtkFBxrX/fH8nKaoUoAM9PJaGJXXZNuhO8yhennfQBqTydLRCq7
1uZpAnG/lR2APzTxnDHVHEXGmTticlb3ko4zRvTREsY4zSFSq0Io5K29ooYw/pHv g8deK/HG+SLP3LjejQQkZGKVddC+9HdYm+YxFi7y+5hPj42PcBYiXZy9IHJLZI5U
hw3hvirRzjYkaxK5yzLCw788FkRLjpO4yuTYxD3pQ6HpfMMpTl9nCK3IOMqbyaX2 x1hHJNpgf3djLm73XyFqDqcmkQZip77B+y3chLpse8ocscf3uWjMouJ1fsdnEHya
espY0zmJr/vqbWgqzSlyptXDW80/mAn1nDhQe1qkTW94gqL9GKhGtydFCOKxfIM7 SPrqkPcrdPbzGiV4SZTLdVoEEeqJnFK6vmCKDQZ37E8CO4UxVB8L5MlQl7FIv+7X
Y5X7DlMXc1kbup5pw3p8xkltD4KNcG+QuePPIvFp05oiLAHZpO0d3i2pAtiVyQ+7 cYn2ped+YLX2RHGM9snBft854RRnUs/7Vy13ml3vqCgzUsRRQ/9VHMNO4t6Lqk8n
YvlEQlqw0LCz8MaDRGZg4+Q3nxPtmg4z7Ms8gsZaKFiyRZCMOg6NEDFwhZPAFJ+6 syFfD5oO+0MsKKedFKAEfH8MeTBTgPsdd/tfZnMk8tsAkrVGVzongiVRIIN3zAJx
JH6Pnbq244LkKYCJNuZpp9rYeOWIIMNevQyHc6iorInnSGJfzxz347NfwV2fcn4b /i+sLkDYm0+tHGEgcjahuErEO5xEFCLLaBmdL5ugQ9ZgqM31Nq92ZhW/TXt2EORn
gQGPbHJOMNDlHnVZgp2ONlVvaSC6DWWE1iGNmOcNcc09PJV87qf8x9SI5FXipsvn Fmd0dnP4Ssdz0JfLqW9S3orr/Mixrd2xC+V2+Diul2PTfhIMbs7AoTVy4LepSeLd
fiVynueMcgSwqQRddt4O408CAwEAAQ== BKlFoBdRd39a+D+S8PyCVSUCAwEAAQ==
-----END rsa public key----- -----END rsa public key-----