Merge branch 'fixmapsync' into 'master'
修一个map的并发 See merge request public_project/utility_go!2
This commit is contained in:
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user