• golang 中 channel 的非阻塞访问方法


    在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")
        }
    }

    输出:

    no message received
    no message sent
    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)
  • 相关阅读:
    spring前两天
    代理模式
    学习spring第三天
    Spring集成MyBatis配置文件
    学习spring第二天
    学习spring第一天
    Bind关闭递归查询
    织梦DedeCMS v5.7 实现导航条下拉菜单
    Debian下修改系统时间的方式
    js禁止页面复制功能禁用页面右键菜单示例代码
  • 原文地址:https://www.cnblogs.com/welhzh/p/9167032.html
Copyright © 2020-2023  润新知