golang-select调度器

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

select 方式进行调度

使用场景:
比如有多个通道,但我打算是哪一个通道先给我数据,我就先执行谁
这个select 可以是并行执行 channel管道

package main

import (
    "fmt"
    "math/rand"
    "time"
)

/**
    select 方式进行调度

        使用场景:比如有多个通道,但我打算是哪一个通道先给我数据,我就先执行谁
        这个select 可以是并行执行 channel管道

 */

// 发送值
func generator() chan int {
    out := make(chan int)

    go func() {
        i := 0
        for {
            // 随机睡眠, 1500毫秒以内
            time.Sleep(time.Duration(rand.Intn(1500)) * time.Millisecond)

            // 往 out  这个channel里面传输 i 这个值
            out <- i
            i++
        }
    }()

    return out
}


func main() {

    /**
        如果 channel (chan) 是 nil, 在 select里面也是可以使用的,只不过是堵塞状态!
     */

    // var c1, c2 chan int // c1 和 c2 是 nil
    var c1, c2 = generator(), generator() // 赋值

    // 从 channel里面接收数据
    //n1 := <- c1
    //n2 := <- c2

    /**
        上面两个通道有数据,是同类型的数据,但是我想谁先给我数据,我就要谁
     */
    for  {
        select {
        case n := <- c1:
            fmt.Println("从 c1 获取到数据:", n)
        case n := <- c2:
            fmt.Println("从 c2 获取到数据:", n)
        //default:
        //  fmt.Println("通道内。没有数据!")
        }
    }


}


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:爱吃豆包

查看原文:golang-select调度器

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

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