forked from hprose/hprose-golang
-
Notifications
You must be signed in to change notification settings - Fork 0
/
limiter.go
60 lines (53 loc) · 1.78 KB
/
limiter.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
/**********************************************************\
| |
| hprose |
| |
| Official WebSite: http://www.hprose.com/ |
| http://www.hprose.org/ |
| |
\**********************************************************/
/**********************************************************\
* *
* rpc/limiter.go *
* *
* hprose client requests limiter for Go. *
* *
* LastModified: Nov 1, 2016 *
* Author: Ma Bingyao <andot@hprose.com> *
* *
\**********************************************************/
package rpc
import "sync"
// Limiter is a request limiter
type Limiter struct {
MaxConcurrentRequests int
requestCount int
sync.Cond
}
// InitLimiter initializes Limiter
func (limiter *Limiter) InitLimiter() {
limiter.MaxConcurrentRequests = 10
limiter.L = &sync.Mutex{}
}
// Limit the request
func (limiter *Limiter) Limit() {
for {
if limiter.requestCount < limiter.MaxConcurrentRequests {
break
}
limiter.Wait()
}
limiter.requestCount++
}
// Unlimit the request
func (limiter *Limiter) Unlimit() {
limiter.requestCount--
limiter.Signal()
}
// Reset the Limiter
func (limiter *Limiter) Reset() {
limiter.requestCount = 0
for i := limiter.MaxConcurrentRequests; i > 0; i-- {
limiter.Signal()
}
}