Merge branch 'fixmapsync' into 'master'

修一个map的并发

See merge request public_project/utility_go!2
This commit is contained in:
2025-08-21 08:41:14 +00:00

View File

@@ -59,9 +59,34 @@ var (
gamelogClient *gclient.Client gamelogClient *gclient.Client
// location map // 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 { func (sdk *SDK) varinit() error {
sdk.sdkConfig = &SDKConfig{} 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) { func (sdk *SDK) Log(uid, event string, property map[string]any, timezone string) {
loc := time.Local loc := time.Local
if _, ok := locationMap[timezone]; !ok { if _loc := getLocationMapValue(timezone); _loc != nil {
location, err := time.LoadLocation(timezone) loc = _loc
if err != nil {
g.Log().Warningf(ctx, "[GameLog]load location error, try use local timezone: %v", err)
} else {
locationMap[timezone] = location
loc = location
}
} }
log := GameLog{ log := GameLog{
Uid: uid, Uid: uid,