如何在Go中将time.Time变量转换为原子?

时间:2018-05-19 08:11:33

标签: go atomic

在我的RESTFUL网络服务中,这是一个在线游戏,我将每个问题的开始时间存储在一个全局变量中:def post(self, request): video_file = request.FILES.get('media_file', None) user_email_id = request.POST.get('email_id', None) # you should probably validate video_file and user_email_id here file_storage = FileSystemStorage() saved_file_name = file_storage.save(str(uuid.uui`d4()), video_file) 我应该在每个级别的游戏后更新它。我的应用程序是分发的,所以我想确保我的所有应用程序不会同时更新它。这就是为什么我决定让它成为原子的原因。 其实我熟悉Golang var MyTime time.Time包。 我尝试使用sync/atomic方法,但它需要特定的参数类型,这是不安全的。你还有别的办法吗?

更新 好吧,我这样解决了我的问题。 我将时间变量定义为atomic.LoadPointer()并使用原子加载和存储方法。这是代码: atomic.Value并加载var myTime atomic.Value myTime.Store(newTime)

考虑到Load()方法返回接口,所以你应该在末尾写(time.Time)以便将它转换为time.Time类型。

2 个答案:

答案 0 :(得分:4)

这样做不可能,因为time.Time是复合类型:

awk

但是,您可以使用指针执行此操作,因此如果符合您的需要,awk将是可能的。但当然,由于type Time struct { // wall and ext encode the wall time seconds, wall time nanoseconds, // and optional monotonic clock reading in nanoseconds. // // From high to low bit position, wall encodes a 1-bit flag (hasMonotonic), // a 33-bit seconds field, and a 30-bit wall time nanoseconds field. // The nanoseconds field is in the range [0, 999999999]. // If the hasMonotonic bit is 0, then the 33-bit field must be zero // and the full signed 64-bit wall seconds since Jan 1 year 1 is stored in ext. // If the hasMonotonic bit is 1, then the 33-bit field holds a 33-bit // unsigned wall seconds since Jan 1 year 1885, and ext holds a // signed 64-bit monotonic clock reading, nanoseconds since process start. wall uint64 ext int64 // loc specifies the Location that should be used to // determine the minute, hour, month, day, and year // that correspond to this Time. // The nil location means UTC. // All UTC times are represented with loc==nil, never loc==&utcLoc. loc *Location } *time.Time使用atomic.LoadPointer包来完成他们的魔法,这是不鼓励的。

更好的方法,如果它适用于您,只需使用互斥锁来保护您的价值。有很多方法可以做到这一点,但有一个最小的例子:

atomic.StorePointer

答案 1 :(得分:1)

你可以将unix时间https://golang.org/pkg/time/#example_Time_Unix保持为int64的原子。然后在你读完原子值后转换为时间。