在我的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类型。
答案 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的原子。然后在你读完原子值后转换为时间。