From 20cee1421fc6aa9798dbb783a65de29ff63bede4 Mon Sep 17 00:00:00 2001 From: Edward Date: Mon, 27 Apr 2020 23:36:22 +0800 Subject: [PATCH] add concurrency and syncs --- README.md | 4 +- concurrency/rate_limiting_test.go | 105 ++++++++++++++++++++++++++++++ syncs/README.md | 3 + 3 files changed, 109 insertions(+), 3 deletions(-) create mode 100644 concurrency/rate_limiting_test.go create mode 100644 syncs/README.md diff --git a/README.md b/README.md index a0ac899..e3e4b99 100644 --- a/README.md +++ b/README.md @@ -44,9 +44,7 @@ Go常用的、面向工程化和最佳实践的模式套路,包含常见的23 + [访问者模式(Visitor)](./behavior/23_visitor) + [闭包选项模式(Function Option)](./behavior/26_option) -## 参考资(Design patters Articles) - -[大话设计模式](https://book.douban.com/subject/2334288/) +## 参考资料(Design patters Articles) [GO模式文档](https://github.com/nynicg/go-patterns) diff --git a/concurrency/rate_limiting_test.go b/concurrency/rate_limiting_test.go new file mode 100644 index 0000000..f58131a --- /dev/null +++ b/concurrency/rate_limiting_test.go @@ -0,0 +1,105 @@ +package concurrency + +import ( + "fmt" + "testing" + "time" +) + +/* + +Rate limiting is an very important mechanism +With limiting you can controll resource utilization and maintain quality of service. +Go supports rate limiting by using goroutines, channels, and tickers. +*/ + +func TestRateLimiting(t *testing.T) { + requests := make(chan int, 5) + for i := 1; i <= 5; i++ { + requests <- i + } + close(requests) + + limiter := time.Tick(200 * time.Millisecond) + + for req := range requests { + <-limiter + t.Log("Sev request by 2000 Millisecond", req, time.Now()) + } + + burstyLimiter := make(chan struct{}, 3) + + //init burstyLimiter + for i := 0; i < 3; i++ { + burstyLimiter <- struct{}{} + } + go func() { + for { + select { + case <-time.Tick(200 * time.Millisecond): + burstyLimiter <- struct{}{} + } + + } + }() + + //max request queue + burstyRequestsQueue := make(chan int, 5) + for i := 1; i <= 5; i++ { + burstyRequestsQueue <- i + } + close(burstyRequestsQueue) + + for req := range burstyRequestsQueue { + <-burstyLimiter + if len(burstyLimiter) > 0 { + fmt.Println("working current in bursting status!") + } else { + fmt.Println("working current in normal status!") + } + fmt.Println("request handled", req, time.Now()) + } + + rateLimiting() + +} + +func rateLimiting() { + + requests := make(chan int, 5) + for i := 1; i <= 5; i++ { + requests <- i + } + close(requests) + + limiter := time.Tick(200 * time.Millisecond) + + for req := range requests { + <-limiter + fmt.Println("request", req, time.Now()) + } + + //突发限流器 + burstyLimiter := make(chan time.Time, 3) + + for i := 0; i < 3; i++ { + burstyLimiter <- time.Now() + } + + go func() { + for t := range time.Tick(200 * time.Millisecond) { + burstyLimiter <- t + } + }() + + //请求队列 + burstyRequests := make(chan int, 5) + for i := 1; i <= 5; i++ { + burstyRequests <- i + } + close(burstyRequests) + for req := range burstyRequests { + <-burstyLimiter + fmt.Println("request", req, time.Now()) + } +} diff --git a/syncs/README.md b/syncs/README.md new file mode 100644 index 0000000..ff76b98 --- /dev/null +++ b/syncs/README.md @@ -0,0 +1,3 @@ +# 同步模式 + +s同步处理中的一些常用模式 \ No newline at end of file