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

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

  • 相关阅读:
    ceph 网络配置
    Centos7.2 下DNS+NamedManager高可用部署方案完整记录
    Mysql多实例数据库
    Mysql 基础
    搭建本地YUM仓库
    Go实现线程安全的缓存
    KubeEdge安装详细教程
    Kubeedge实现原理
    Go语言中new()和make()的区别
    Go语言中append()函数的源码实现在哪里?
  • 原文地址:https://www.cnblogs.com/yhleng/p/11752595.html
Copyright © 2011-2022 走看看