美文网首页
浅谈go 的select

浅谈go 的select

作者: 学不会swoole不改名 | 来源:发表于2019-04-26 15:53 被阅读0次
因为go的channel是并发执行的,并不像swoole的chan,这时候就会产生一个问题,如果我有两个或者更多的chan,我怎么先执行执行速度更快的哪一个,或者到一定的时间我要终止他,等等,select可以解决
package main

import (
    "fmt"
    "time"
)

//
func everyUse() chan int {
    output := make(chan int)
    for i := 0; i < 2000; i++ {
        go func(i int) {
            for {
                time.Sleep(time.Second)
                output <- i
            }
        }(i)
    }

    return output
}

//use create
func createworker(id int) chan int {
    c := make(chan int)
    go func() {
        for {
            fmt.Printf("is %d,come %d\n", id, <-c)
        }
    }()
    return c
}

func main() {
    var c1, c2 = everyUse(), everyUse() //make double channel
    var values []int                    //create a quene
    var worker = createworker(0)        //var worker
    //run 10s to stop
    tm := time.After(10 * time.Second)
    //1s i can see values len
    tk := time.Tick(time.Second)
    for { // if no tm it will work never stop
        var activeWork chan int //make channel
        var activeValue int     //make value
        if len(values) > 0 {    //if has values
            activeWork = worker
            activeValue = values[0] //activeValue is now your value
        }

        select {
        case n := <-c1:
            values = append(values, n) //input queue
        case n := <-c2:
            values = append(values, n) //input queue
        case activeWork <- activeValue: //make your now value goto channel to worker to createrWorker
            values = values[1:]
        case <-time.After(800 * time.Microsecond): //if 800ms no value echo timeout
            fmt.Println("time out")
        case <-tk: //1s i see may values len
            fmt.Printf("values  len is %d", len(values))
        case <-tm: //good bye
            fmt.Println("see you na la")
            return
        }
    }

}


select 不会就某一个case一直读取,会读取当前可以读取到的case,当没有读取到case的时候,就会执行default,有数据读取到额时候就会执行case

vscode不支持中文注释,会警告,强迫症,中文式英语……

相关文章

  • 浅谈go 的select

    因为go的channel是并发执行的,并不像swoole的chan,这时候就会产生一个问题,如果我有两个或者更多的...

  • 浅谈 select、poll 和 epoll

    title: 浅谈 select、poll 和 epolltags: [select, poll, epoll, ...

  • thunderbird ssl_error_weak_serve

    go to Tools > Options, select the Advanced panel, select ...

  • GO学习笔记(18) - 并发编程(3)- Select与Cha

    本文主要讲解Go并发编程之Select 目录 介绍 基础语法 timeout 综合实例 select 是 Go 中...

  • go select

    select的用法与switch非常类似,由select开始一个新的选择块,每个选择条件由case语句来描述。与s...

  • Go select

    通过select语句可以监听channel上的数据流动 Golang的select语句类似于UNIX的select...

  • Go并发编程之select、锁和条件变量

    1. select select 的作用 Go里面提供了一个关键字select,通过select可以监听chann...

  • Go 语言编程实例(二)

    select 实例 Go 语言选择(select)可以等待多个通道操作。将 goroutine 和 channel...

  • go 中的 select

    select 规则select 和 IO 复用中的sleect 差不多一个思想,都是想通过多路复用提高效率。其满足...

  • Go Select 详解

    导读 select是一种go可以处理多个通道之间的机制,看起来和switch语句很相似,但是select其实和IO...

网友评论

      本文标题:浅谈go 的select

      本文链接:https://www.haomeiwen.com/subject/uevfnqtx.html