golang 速度限制,time.Tick(time.Second*2) channel,隔2秒后继续执行

benlightning · · 10666 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。
package main

import (
    "fmt"
    "time"
)

func main() {
    requests := make(chan int, 5)
    for i := 1; i <= 2; i++ {
        requests <- i
    }
    close(requests)
    limiter := time.Tick(time.Millisecond * 200)

    for req := range requests { //会循环两次,前面往requests channel中发送了两个值
        <-limiter  //执行到这里,需要隔 200毫秒才继续往下执行,time.Tick(timer)上面已定义
        fmt.Println("request", req, time.Now())
    }

    burstyLimiter := make(chan time.Time, 3)

    for i := 0; i < 3; i++ {
        burstyLimiter <- time.Now()  //这里burstyLimiter channel 连续发送了三次值
    }

    go func() {
        for t := range time.Tick(time.Second * 2) {
            burstyLimiter <- t // 这里往burstyLimiter channel 循环发送time.Tick
        }
    }()
    burstyRequests := make(chan int, 5)

    for i := 1; i <= 5; i++ {
        burstyRequests <- i
        <-burstyLimiter  //前三次没有速度限制,会直接打印出后面的println的内容
        fmt.Println("request", i, time.Now())
    }

    close(burstyRequests)
    for req := range burstyRequests {
        <-burstyLimiter  //继续接收burstyLimiter值,除了前三次,后面的都是time.Tick进行速度限制,2秒打印一次,直到此次循环结束
        fmt.Println("request", req, time.Now())
    }
}

注,把time.Tick(time.Second)中的值改为秒会更容易查看效果

本文来自:博客园

感谢作者:benlightning

查看原文:golang 速度限制,time.Tick(time.Second*2) channel,隔2秒后继续执行

入群交流(和以上内容无关):Go中文网 QQ 交流群:798786647 或加微信入微信群:274768166 备注:入群;关注公众号:Go语言中文网

10666 次点击  
加入收藏 微博
被以下专栏收入,发现更多相似内容
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传