zoukankan      html  css  js  c++  java
  • go语言从例子开始之Example28.非阻塞通道操作

    常规的通过通道发送和接收数据是阻塞的。然而,我们可以使用带一个 default 子句的 select 来实现非阻塞 的发送、接收,甚至是非阻塞的多路 select

    Example:

    package main
    import "fmt"
    func main() {
        messages := make(chan string)
        signals := make(chan bool)
        //这里是一个非阻塞接收的例子。如果在 messages 中存在,然后 select 将这个值带入 <-messages case中。如果不是,就直接到 default 分支中。
    
        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")
        }
        //我们可以在 default 前使用多个 case 子句来实现一个多路的非阻塞的选择器。这里我们试图在 messages和 signals 上同时使用非阻塞的接受操作。
    
        select {
        case msg := <-messages:
            fmt.Println("received message", msg)
        case sig := <-signals:
            fmt.Println("received signal", sig)
        default:
            fmt.Println("no activity")
        }
    }

    Result:

    $ go run example.go
    no message received
    no message sent
    no activity

    坐标: 上一个例子    下一个例子

  • 相关阅读:
    浅析 KMP
    【GOJ 3049】玩具
    较详细的gdb入门教程
    【GOJ 2963】记者
    【GOJ 2961】数数
    GF OIer's Talk 维护笔记
    Linux 中 UFW 的使用
    开源是什么?能吃吗?
    个人介绍
    NOIP2020 爆零记
  • 原文地址:https://www.cnblogs.com/yhleng/p/11752595.html
Copyright © 2011-2022 走看看