美文网首页云计算
golang 中 channel 的非阻塞访问方法

golang 中 channel 的非阻塞访问方法

作者: 梅_梅 | 来源:发表于2018-10-24 10:14 被阅读0次

    在golang中,基本的channel读写操作都是阻塞的,如果你想要非阻塞的,可以使用如下示例:

    即只要在select中加入default,阻塞立即变成非阻塞:

    package main
    
    import "fmt"
    
    func main() {
        messages := make(chan string)
        signals := make(chan bool)
    
        select {
        case msg := <-messages:
            fmt.Println("received message", msg)
        default:
            fmt.Println("no message received")
        }
    
        msg := "hi"
        select {
        case messages <- msg:
            fmt.Println("sent message", msg)
        default:
            fmt.Println("no message sent")
        }
    
        select {
        case msg := <-messages:
            fmt.Println("received message", msg)
        case sig := <-signals:
            fmt.Println("received signal", sig)
        default:
            fmt.Println("no activity")
        }
    }
    

    注意,golang无法kill 一个 goroutine,你 #只能# 通过一个channel给它发送消息让它退出,示例如下:

    quit := make(chan bool)
    go func() {
        for {
            select {
            case <- quit:
                return
            default:
                // Do other stuff
            }
        }
    }()
    
    // Do stuff
    
    // Quit goroutine
    close(quit)
    

    相关文章

      网友评论

        本文标题:golang 中 channel 的非阻塞访问方法

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