from datetime import datetime
from datetime import timedelta
class
bucket
(object):
def__init__
(self, peroid)
: self.peroid_delta = timedelta(seconds = peroid)
self.reset_time = datetime.now(
) self.max_quota =
0 self.quota_consume =
0 @property
defquota
(self)
:return self.max_quota - self.quota_consume
@quota.setter
defquota
(self, amount)
: delta = self.max_quota - amount
if amount ==0:
self.quota_consume =
0 self.max_quota =
0elif delta <0:
assert self.quota_consume ==
0 self.max_quota = amount
else
:assert self.max_quota >= self.quota_consume
self.quota_consume += delta
def__repr__
(self)
:return
('bucket(max_quota = %d, quota_consume= %d)'
%(self.max_quota, self.quota_consume)
)def
fill
(bucket, amount)
: now = datetime.now(
)if now - bucket.reset_time > bucket.peroid_delta:
bucket.quota =
0 bucket.peroid_delta =
0 bucket.quota += amount
defdeduct
(bucket, amount)
:'''
上面的操作缺點是無法得知漏桶的初始配額。初始配額會在每個週期內持續流失,如果降到0,那麼deduct就總是返回false
此時依賴deduct的那些操作就會受到阻礙,但是我們沒有辦法判斷出是bucket裡面所剩的配額不足還是根本就沒有配額。
'''now = datetime.now(
)if now - bucket.reset_time > bucket.peroid_delta:
return
false
if bucket.quota - amount <0:
return
false
bucket.quota -= amount
return
true
bucket = bucket(60)
print
('initial'
, bucket)
fill(bucket,
100)
print
('filled'
, bucket)
if deduct(bucket,99)
:print
('had 99'
)else
:print
('not enough for 99'
)print
('now'
, bucket)
print
(bucket.quota)
property屬性引數
1.讀寫屬性 預設是readwrite,會生成getter和setter方法 如果是readonly表示只會生成getter方法 2.setter處理 預設是assign 賦值 因此基本資料型別不需要加這個引數。因為在setter方法裡,我們經常要將乙個物件賦值給類的成員屬性,這個時候根據記憶體管理...
Property 屬性動畫
單個屬性動畫 objectanimator offloat view,rotationx 0,180 setduration 3000 start 多個屬性動畫 多個屬性動畫組合 設定乙個中心點 view.setpivotx 0.5f view.setpivoty 0.5f 方式一 建立多個屬性動畫...
屬性(Property)動畫
屬性動畫與補間動畫的區別 最大的區別是補間動畫就算控制項移動到任何位置,控制項本身位置還是不變。而屬性動畫是直接改變控制項的位置。從某種角度看,屬性動畫是增強版的補間動畫,其強大體現在兩方面 補間 tween 動畫只能定義兩個關鍵幀在透明度 旋轉 傾斜 位移這4個方面的變化,而屬性動畫可以定義任何屬...