内存锁模块,也称之为动态互斥锁模块,支持按照给定键名动态生成互斥锁,并发安全并支持Try*Lock
特性。
当维护大量动态互斥锁的场景时,如果不再使用的互斥锁对象,请手动调用Remove
方法删除掉。
使用方式:
import "github.com/gogf/gf/v2/os/gmlock"
使用场景: 需要动态创建互斥锁,或者需要维护大量动态锁的场景;
接口文档:https://pkg.go.dev/github.com/gogf/gf/v2/os/gmlock
func Lock(key string)
func LockFunc(key string, f func())
func RLock(key string)
func RLockFunc(key string, f func())
func RUnlock(key string)
func Remove(key string)
func TryLock(key string) bool
func TryLockFunc(key string, f func()) bool
func TryRLock(key string) bool
func TryRLockFunc(key string, f func()) bool
func Unlock(key string)
type Locker
func New() *Locker
func (l *Locker) Clear()
func (l *Locker) Lock(key string)
func (l *Locker) LockFunc(key string, f func())
func (l *Locker) RLock(key string)
func (l *Locker) RLockFunc(key string, f func())
func (l *Locker) RUnlock(key string)
func (l *Locker) Remove(key string)
func (l *Locker) TryLock(key string) bool
func (l *Locker) TryLockFunc(key string, f func()) bool
func (l *Locker) TryRLock(key string) bool
func (l *Locker) TryRLockFunc(key string, f func()) bool
func (l *Locker) Unlock(key string)
package main
import (
"time"
"sync"
"github.com/gogf/gf/v2/os/glog"
"github.com/gogf/gf/v2/os/gmlock"
)
func main() {
key := "lock"
wg := sync.WaitGroup{}
for i := 0; i < 10; i++ {
wg.Add(1)
go func(i int) {
gmlock.Lock(key)
glog.Println(i)
time.Sleep(time.Second)
gmlock.Unlock(key)
wg.Done()
}(i)
}
wg.Wait()
}
该示例中,模拟了同时开启10个goroutine
,但同一时刻只能有一个goroutine
获得锁,获得锁的goroutine
执行1秒后退出,其他goroutine
才能获得锁。
执行后,输出结果为:
2018-10-15 23:57:28.295 9
2018-10-15 23:57:29.296 0
2018-10-15 23:57:30.296 1
2018-10-15 23:57:31.296 2
2018-10-15 23:57:32.296 3
2018-10-15 23:57:33.297 4
2018-10-15 23:57:34.297 5
2018-10-15 23:57:35.297 6
2018-10-15 23:57:36.298 7
2018-10-15 23:57:37.298 8
TryLock
方法是有返回值的,它表示用来尝试获取锁,如果获取成功,则返回true
;如果获取失败(即互斥锁已被其他goroutine
获取),则返回false
。
package main
import (
"sync"
"github.com/gogf/gf/v2/os/glog"
"time"
"github.com/gogf/gf/v2/os/gmlock"
)
func main() {
key := "lock"
wg := sync.WaitGroup{}
for i := 0; i < 10; i++ {
wg.Add(1)
go func(i int) {
if gmlock.TryLock(key) {
glog.Println(i)
time.Sleep(time.Second)
gmlock.Unlock(key)
} else {
glog.Println(false)
}
wg.Done()
}(i)
}
wg.Wait()
}
同理,在该示例中,同时也只有1个goroutine
能获得锁,其他goroutine
在TryLock
失败便直接退出了。
执行后,输出结果为:
2018-10-16 00:01:59.172 9
2018-10-16 00:01:59.172 false
2018-10-16 00:01:59.172 false
2018-10-16 00:01:59.172 false
2018-10-16 00:01:59.172 false
2018-10-16 00:01:59.172 false
2018-10-16 00:01:59.172 false
2018-10-16 00:01:59.172 false
2018-10-16 00:01:59.172 false
2018-10-16 00:01:59.176 false
目录扫描ScanDir说明:扫描指定目录,可扫描文件或目录,支持递归扫描。格式:func ScanDir(path string, pattern string, recurs...
Repeat说明:Repeat返回一个由input重复multiplier次后组成的新字符串。格式:Repeat(input string, multiplier int...
Contains说明:Contains返回字符串str是否包含子字符串substr,区分大小写。格式:Contains(str, substr string) bo...
CompareVersion说明:CompareVersion将a和b作为标准GNU版本进行比较。格式:CompareVersion(a, b string) int示...
gjson除了能够灵活解析、检索未知数据结构内容,还能够动态创建和修改数据结构内容。动态创建示例1,简单使用func main() {j...
您可以使用StaticFiles.用StaticFiles进口StaticFiles。StaticFiles()在特定路径中“安装”一个实例。from fastapi import FastA...
distribute的前身是setuptools,是一个通常用于分发 Python 库和扩展程序的外部库。它依赖于随 Python 预装的distutils...