diff --git a/concurrency/channel_example_test.go b/concurrency/channel_example_test.go index dc72281..90bd2ec 100644 --- a/concurrency/channel_example_test.go +++ b/concurrency/channel_example_test.go @@ -3,6 +3,7 @@ package concurrency import ( "context" "fmt" + "log" "time" ) @@ -199,3 +200,160 @@ func ExampleChannel_Bridge() { // 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 +} diff --git a/cryptor/rsa_private_example.pem b/cryptor/rsa_private_example.pem index ada0b1c..662e62d 100644 --- a/cryptor/rsa_private_example.pem +++ b/cryptor/rsa_private_example.pem @@ -1,51 +1,51 @@ -----BEGIN rsa private key----- -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 -----END rsa private key----- diff --git a/cryptor/rsa_public_example.pem b/cryptor/rsa_public_example.pem index 824277b..882be73 100644 --- a/cryptor/rsa_public_example.pem +++ b/cryptor/rsa_public_example.pem @@ -1,14 +1,14 @@ -----BEGIN rsa public key----- -MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAoJVrCBR3dJsdj0Gg9tlk -ToGvywJnJqVWBPgjnS+Hn5Ksxk1yzBieL0aQ84hVXYt0yhCgiDl/eDmgdawqUZ5j -2PhFBDahjvBnchY2ViZXNE61ya3YPEPIwUsZ1Wsmzu5cX6gA1HqE2nx8iZlJQcbG -/rdoxyebhdvUj6iGGvgskggkVYvDYuct+iRekfHMxG3ON+wJ31AC2+0B6w6vgvt1 -1uZpAnG/lR2APzTxnDHVHEXGmTticlb3ko4zRvTREsY4zSFSq0Io5K29ooYw/pHv -hw3hvirRzjYkaxK5yzLCw788FkRLjpO4yuTYxD3pQ6HpfMMpTl9nCK3IOMqbyaX2 -espY0zmJr/vqbWgqzSlyptXDW80/mAn1nDhQe1qkTW94gqL9GKhGtydFCOKxfIM7 -Y5X7DlMXc1kbup5pw3p8xkltD4KNcG+QuePPIvFp05oiLAHZpO0d3i2pAtiVyQ+7 -YvlEQlqw0LCz8MaDRGZg4+Q3nxPtmg4z7Ms8gsZaKFiyRZCMOg6NEDFwhZPAFJ+6 -JH6Pnbq244LkKYCJNuZpp9rYeOWIIMNevQyHc6iorInnSGJfzxz347NfwV2fcn4b -gQGPbHJOMNDlHnVZgp2ONlVvaSC6DWWE1iGNmOcNcc09PJV87qf8x9SI5FXipsvn -fiVynueMcgSwqQRddt4O408CAwEAAQ== +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA36S1XbDH0Hv2xkxzyVRX +ye3O4SBbSRpjq4DFfukkqBM9YDk0JjBjjyYM2678mCRrH6tgDrMBl3GnJp2dufbi +SaCLxYlodGExlWJrY0wRwGBtQHsJE4+wfxtGcjCoGyqCgAw4/fOYSlx3ECBm/mXi +xPNzn0inGTYQ0JtkFBxrX/fH8nKaoUoAM9PJaGJXXZNuhO8yhennfQBqTydLRCq7 +g8deK/HG+SLP3LjejQQkZGKVddC+9HdYm+YxFi7y+5hPj42PcBYiXZy9IHJLZI5U +x1hHJNpgf3djLm73XyFqDqcmkQZip77B+y3chLpse8ocscf3uWjMouJ1fsdnEHya +SPrqkPcrdPbzGiV4SZTLdVoEEeqJnFK6vmCKDQZ37E8CO4UxVB8L5MlQl7FIv+7X +cYn2ped+YLX2RHGM9snBft854RRnUs/7Vy13ml3vqCgzUsRRQ/9VHMNO4t6Lqk8n +syFfD5oO+0MsKKedFKAEfH8MeTBTgPsdd/tfZnMk8tsAkrVGVzongiVRIIN3zAJx +/i+sLkDYm0+tHGEgcjahuErEO5xEFCLLaBmdL5ugQ9ZgqM31Nq92ZhW/TXt2EORn +Fmd0dnP4Ssdz0JfLqW9S3orr/Mixrd2xC+V2+Diul2PTfhIMbs7AoTVy4LepSeLd +BKlFoBdRd39a+D+S8PyCVSUCAwEAAQ== -----END rsa public key-----