|
|
package main |
|
|
|
import ( |
|
"fmt" |
|
"time" |
|
) |
|
|
|
func main() { |
|
|
|
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()) |
request 1 2020-10-21 16:53:50.395291385 +0000 UTC m=+0.200203008
request 2 2020-10-21 16:53:50.599166533 +0000 UTC m=+0.404078122
request 3 2020-10-21 16:53:50.795310384 +0000 UTC m=+0.600222016
request 4 2020-10-21 16:53:50.995286879 +0000 UTC m=+0.800198499
request 5 2020-10-21 16:53:51.195267593 +0000 UTC m=+1.000179165
|
} |
request 1 2020-10-21 16:53:51.835344603 +0000 UTC m=+0.200172935
request 2 2020-10-21 16:53:52.035349525 +0000 UTC m=+0.400177860
request 3 2020-10-21 16:53:52.235373114 +0000 UTC m=+0.600201456
request 4 2020-10-21 16:53:52.435425931 +0000 UTC m=+0.800254255
request 5 2020-10-21 16:53:52.635358659 +0000 UTC m=+1.000186981
|
|
|
burstyLimiter := make(chan time.Time, 3) |
|
|
|
for i := 0; i < 3; i++ { |
|
burstyLimiter <- time.Now() |
request 1 2020-10-21 16:54:02.816778941 +0000 UTC m=+0.200206237
request 2 2020-10-21 16:54:03.016775311 +0000 UTC m=+0.400202600
request 3 2020-10-21 16:54:03.216763927 +0000 UTC m=+0.600191169
request 4 2020-10-21 16:54:03.416764574 +0000 UTC m=+0.800191909
request 5 2020-10-21 16:54:03.616744823 +0000 UTC m=+1.000172050
|
} |
request 1 2020-10-21 16:54:04.232918831 +0000 UTC m=+0.200280371
request 2 2020-10-21 16:54:04.432997938 +0000 UTC m=+0.400359770
request 3 2020-10-21 16:54:04.632931045 +0000 UTC m=+0.600292602
request 4 2020-10-21 16:54:04.832919318 +0000 UTC m=+0.800280921
request 5 2020-10-21 16:54:05.032891925 +0000 UTC m=+1.000253479
|
|
|
go func() { |
|
for t := range time.Tick(200 * time.Millisecond) { |
|
burstyLimiter <- t |
|
} |
|
}() |
request 1 2020-10-21 16:54:10.176046549 +0000 UTC m=+0.200179195
request 2 2020-10-21 16:54:10.376067042 +0000 UTC m=+0.400199627
request 3 2020-10-21 16:54:10.576063101 +0000 UTC m=+0.600195898
request 4 2020-10-21 16:54:10.776036879 +0000 UTC m=+0.800169467
request 5 2020-10-21 16:54:10.976052867 +0000 UTC m=+1.000185446
|
|
|
burstyRequests := make(chan int, 5) |
|
for i := 1; i <= 5; i++ { |
|
burstyRequests <- i |
request 1 2020-10-21 16:54:17.828242725 +0000 UTC m=+0.200199154
request 2 2020-10-21 16:54:18.028291874 +0000 UTC m=+0.400248385
request 3 2020-10-21 16:54:18.228258219 +0000 UTC m=+0.600214720
request 4 2020-10-21 16:54:18.428244427 +0000 UTC m=+0.800200934
request 5 2020-10-21 16:54:18.628256684 +0000 UTC m=+1.000213216
|
} |
request 1 2020-10-21 16:54:19.233902539 +0000 UTC m=+0.200206278
request 2 2020-10-21 16:54:19.433884891 +0000 UTC m=+0.400188622
request 3 2020-10-21 16:54:19.633922697 +0000 UTC m=+0.600226519
request 4 2020-10-21 16:54:19.83391026 +0000 UTC m=+0.800213976
request 5 2020-10-21 16:54:20.033891067 +0000 UTC m=+1.000194793
|
close(burstyRequests) |
request 1 2020-10-21 16:54:20.668442616 +0000 UTC m=+0.200238556
request 2 2020-10-21 16:54:20.868384667 +0000 UTC m=+0.400180641
request 3 2020-10-21 16:54:21.068404615 +0000 UTC m=+0.600200562
request 4 2020-10-21 16:54:21.268510532 +0000 UTC m=+0.800306470
request 5 2020-10-21 16:54:21.468431947 +0000 UTC m=+1.000227939
|
for req := range burstyRequests { |
|
<-burstyLimiter |
|
fmt.Println("request", req, time.Now()) |
request 1 2020-10-21 16:54:22.678544517 +0000 UTC m=+0.200264505
request 2 2020-10-21 16:54:22.878521123 +0000 UTC m=+0.400240991
request 3 2020-10-21 16:54:23.07852738 +0000 UTC m=+0.600247293
request 4 2020-10-21 16:54:23.278523098 +0000 UTC m=+0.800242968
request 5 2020-10-21 16:54:23.478542539 +0000 UTC m=+1.000262515
request 1 2020-10-21 16:54:23.47859248 +0000 UTC m=+1.000312349
request 2 2020-10-21 16:54:23.478600138 +0000 UTC m=+1.000320005
request 3 2020-10-21 16:54:23.478614967 +0000 UTC m=+1.000334841
request 4 2020-10-21 16:54:23.678733121 +0000 UTC m=+1.200453007
request 5 2020-10-21 16:54:23.878721299 +0000 UTC m=+1.400441217
|
} |
request 1 2020-10-21 16:54:24.470811399 +0000 UTC m=+0.200246254
request 2 2020-10-21 16:54:24.670758827 +0000 UTC m=+0.400193482
request 3 2020-10-21 16:54:24.871167288 +0000 UTC m=+0.600601913
request 4 2020-10-21 16:54:25.070775841 +0000 UTC m=+0.800210554
request 5 2020-10-21 16:54:25.270805827 +0000 UTC m=+1.000240505
request 1 2020-10-21 16:54:25.270854384 +0000 UTC m=+1.000289018
request 2 2020-10-21 16:54:25.270859646 +0000 UTC m=+1.000294273
request 3 2020-10-21 16:54:25.270863497 +0000 UTC m=+1.000298116
request 4 2020-10-21 16:54:25.470974975 +0000 UTC m=+1.200409608
request 5 2020-10-21 16:54:25.67116232 +0000 UTC m=+1.400596974
|
} |
request 1 2020-10-21 16:54:26.271738531 +0000 UTC m=+0.200278269
request 2 2020-10-21 16:54:26.471727684 +0000 UTC m=+0.400267456
request 3 2020-10-21 16:54:26.671712201 +0000 UTC m=+0.600251980
request 4 2020-10-21 16:54:26.871703296 +0000 UTC m=+0.800243237
request 5 2020-10-21 16:54:27.071760433 +0000 UTC m=+1.000300158
request 1 2020-10-21 16:54:27.071817886 +0000 UTC m=+1.000357577
request 2 2020-10-21 16:54:27.071835043 +0000 UTC m=+1.000374733
request 3 2020-10-21 16:54:27.071840685 +0000 UTC m=+1.000380381
request 4 2020-10-21 16:54:27.271919949 +0000 UTC m=+1.200459667
request 5 2020-10-21 16:54:27.471947605 +0000 UTC m=+1.400487336
|