修一个map的并发

This commit is contained in:
2025-08-21 16:39:47 +08:00
parent 183d6d8b10
commit 19a19c1ff1

View File

@@ -59,9 +59,34 @@ var (
gamelogClient *gclient.Client
// location map
locationMap map[string]*time.Location = map[string]*time.Location{}
// locationMap map[string]*time.Location = map[string]*time.Location{}
locationMap sync.Map // 声明一个线程安全的Map
)
func getLocationMapValue(key string) *time.Location {
// 1. 先尝试读
value, loaded := locationMap.Load(key)
if loaded {
return value.(*time.Location) // 如果已经存在,直接返回
}
// 2. 不存在就初始化一个该key对应的**固定的**新值
location, err := time.LoadLocation(key)
if err != nil {
g.Log().Warningf(ctx, "[GameLog]load location error, try use local timezone: %v", err)
return nil
}
// 3. 核心原子性地存储如果key已存在则返回已存在的值
actualValue, loaded := locationMap.LoadOrStore(key, location)
if loaded {
// 如果loaded为true说明其他goroutine抢先存了
// 我们可以丢弃刚创建的newValue如果有需要的话返回已存在的actualValue
return actualValue.(*time.Location)
}
// 如果loaded为false说明是我们存成功的返回我们刚创建的newValue
return actualValue.(*time.Location)
}
func (sdk *SDK) varinit() error {
sdk.sdkConfig = &SDKConfig{}
@@ -245,14 +270,8 @@ const datetimeFmt = time.DateOnly + " " + time.TimeOnly
// 记录日志
func (sdk *SDK) Log(uid, event string, property map[string]any, timezone string) {
loc := time.Local
if _, ok := locationMap[timezone]; !ok {
location, err := time.LoadLocation(timezone)
if err != nil {
g.Log().Warningf(ctx, "[GameLog]load location error, try use local timezone: %v", err)
} else {
locationMap[timezone] = location
loc = location
}
if _loc := getLocationMapValue(timezone); _loc != nil {
loc = _loc
}
log := GameLog{
Uid: uid,