// create a Limit Object
// it will allow maxNum_in_period requests(call TO()) in ms_in_period. if the request(call TO()) is out of maxNum_in_period,it will wait ms_to_timeout
func New(maxNum_in_period,ms_in_period,ms_to_timeout int) (*limit) {
- if maxNum_in_period < 1 {panic(`limit max < 1`)}
-
- returnVal := limit{
+ object := limit{
maxNum_in_period:maxNum_in_period,
ms_in_period:ms_in_period,
ms_to_timeout:ms_to_timeout,
channl:make(chan struct{},maxNum_in_period),
}
- go func(returnVal *limit){
- for {
- for i:=1;i<=returnVal.maxNum_in_period;i++{
- returnVal.channl <- struct{}{}
+ go func(object *limit){
+ for object.maxNum_in_period > 0 {
+ for i:=1;i<=object.maxNum_in_period;i++{
+ object.channl <- struct{}{}
}
- time.Sleep(time.Duration(ms_in_period)*time.Millisecond)
+ time.Sleep(time.Duration(object.ms_in_period)*time.Millisecond)
}
- }(&returnVal)
+ }(&object)
- return &returnVal
+ return &object
}
// the func will return true if the request(call TO()) is up to limit and return false if not
time.Sleep(time.Millisecond)
}
t.Log(pass)
+}
+
+func Test_4(t *testing.T){
+ l := New(0,0,10)
+ pass := 0
+ for i:=0;i<500;i+=1{
+ go func(){
+ if !l.TO() {pass += 1}
+ }()
+ time.Sleep(time.Millisecond)
+ }
+ t.Log(pass)
}
\ No newline at end of file