8.4 Go select

Go语言引入了select关键字,用于处理异步IO问题,语义和switch特别相似。语法由select开始,每个条件由case语句来描述。每个case语句必须是IO操作

select {
case <-chan1:
//如果读取到channel的数据,就执行这里
case chan2<-1:
//如果成功向chan2写入数据,就执行这里
default:
//上述都失败了,进入这里
}

案例

使用select可以解决从管道取数据的阻塞问题

package main

import (
"fmt"
"time"
) func main() {
//定义一个管道
intChan := make(chan int, 10) //循环写入数据
for i := 0; i < 10; i++ {
intChan <- i
}
//定义管道,可以写入string
strChan := make(chan string, 5)
for i := 0; i < 5; i++ {
//格式化后写入string数据
strChan <- "hello" + fmt.Sprintf("%d", i)
}
//传统的for循环遍历,必须close关闭channel,否则造成死锁
//但是到底关闭哪个channel,并不那么容易选择
//加上for无线循环,匹配所有的case,直到结束return
for {
select {
//如果有数据被读取到,进入这个分支,并且intChan没关闭的话,也会自动匹配下一个case
case v := <-intChan:
fmt.Printf("从intChan读取到数据%d\n", v)
time.Sleep(time.Second)
case v2 := <-strChan:
fmt.Printf("从strChan中读取到数据%s\n", v2)
time.Sleep(time.Second)
default:
fmt.Printf("什么也没读到,再见\n")
time.Sleep(time.Second)
return
}
} }

1.1.1. waitGroup等待组

package main

import (
"fmt"
"math/rand"
"sync"
"time"
) func main() {
/*
同步等待组:WaitGourp,执行了wait的goroutine,要等待同步等待组中的其他的goroutine执行完毕。。
内置的计数器:counter:0
Add(),设置counter的值
Done(),将counter减一,同Add(-1) 以上两个方法可以设置counter的值,注意不能为负数,否则会引发恐慌。 Wait(),哪个goroutine执行了,那么就会被阻塞,直到counter为0。解除阻塞
*/
var wg sync.WaitGroup
//fmt.Printf("%T\n",wg)
//fmt.Println(wg)
wg.Add(2) go printNum1(&wg)
go printNum2(&wg) wg.Wait() //main,进入阻塞状态,底层计数器为0,接触阻塞。。
//time.Sleep(1*time.Second)
fmt.Println("main。。接触阻塞。。结束了。。。")
} func printNum1(wg *sync.WaitGroup) {
rand.Seed(time.Now().UnixNano())
for i := 1; i <= 100; i++ {
fmt.Println("子goroutine1,i:", i)
time.Sleep(time.Duration(rand.Intn(1000))) //
}
wg.Done() //计数器减一
} func printNum2(wg *sync.WaitGroup) {
for j := 1; j <= 100; j++ {
fmt.Println("\t子goroutine2,j:", j)
time.Sleep(time.Duration(rand.Intn(1000)))
}
wg.Done()
}

8.4 Go select的更多相关文章

  1. 最全的ORACLE-SQL笔记

    -- 首先,以超级管理员的身份登录oracle sqlplus sys/bjsxt as sysdba --然后,解除对scott用户的锁 alter user scott account unloc ...

  2. Matplotlib数据可视化(6):饼图与箱线图

    In [1]: from matplotlib import pyplot as plt import numpy as np import matplotlib as mpl mpl.rcParam ...

  3. SELECT INTO 和 INSERT INTO SELECT 两种表复制语句

    Insert是T-sql中常用语句,Insert INTO table(field1,field2,...) values(value1,value2,...)这种形式的在应用程序开发中必不可少.但我 ...

  4. select、poll、epoll之间的区别总结

    select.poll.epoll之间的区别总结 05/05. 2014 select,poll,epoll都是IO多路复用的机制.I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪 ...

  5. LINQ to SQL Select查询

    1. 查询所有字段 using (NorthwindEntities context = new NorthwindEntities()) { var order = from n in contex ...

  6. ADO.NET一小记-select top 参数问题

    异常处理汇总-后端系列 http://www.cnblogs.com/dunitian/p/4523006.html 最近使用ADO.NET的时候,发现select top @count xxxx 不 ...

  7. iosselect:一个js picker项目,在H5中实现IOS的select下拉框效果

    具体文档和demo可以访问github:https://github.com/zhoushengmufc/iosselect 移动端浏览器对于select的展示样式是不一致的,ios下是类似原生的pi ...

  8. SQL Server中SELECT会真的阻塞SELECT吗?

    在SQL Server中,我们知道一个SELECT语句执行过程中只会申请一些意向共享锁(IS) 与共享锁(S), 例如我使用SQL Profile跟踪会话86执行SELECT * FROM dbo.T ...

  9. (转载) Linux IO模式及 select、poll、epoll详解

    注:本文是对众多博客的学习和总结,可能存在理解错误.请带着怀疑的眼光,同时如果有错误希望能指出. 同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同的上下文下给出的答案 ...

  10. 基于select的python聊天室程序

    python网络编程具体参考<python select网络编程详细介绍>. 在python中,select函数是一个对底层操作系统的直接访问的接口.它用来监控sockets.files和 ...

随机推荐

  1. PHP(ThinkPHP5.0) + PHPMailer 进行邮箱发送验证码

    GitHub下载最新版第三方类库PHPMailer: 第一步: 打开网址https://github.com/PHPMailer/PHPMailer/ 下载PHPMailer,PHPMailer 需要 ...

  2. 2019-2020-1 20199303《Linux内核原理与分析》第九周作业

    进程的切换和一般执行过程 知识总结 操作系统原理中介绍了大量进程调度算法,这些算法从实现的角度看仅仅是从运行队列中选择一个新进程,选择的过程中运用了不同的策略而已. 对于理解操作系统的工作机制,反而是 ...

  3. 文件上传漏洞(pikachu)

    文件上传漏洞 文件上传功能在web应用系统很常见,比如很多网站注册的时候需要上传头像,附件等等.当用户点击上传按钮后,后台会对上传的文件进行判断,比如是否是指定的类型.后缀名.大小等等,然后将其按照设 ...

  4. 通过注册表查询 .Net Framework 的版本

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full 注意:即使卸载 .Net Framework 这些注册表依然 ...

  5. [Windows] DiskPart commands

    https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/diskpart

  6. [Inno Setup] 安装完成后调用函数

    如果使用了通配符,每拷贝一个文件,函数都会被调用一次. Source: "path\test.exe"; DestDir: {app}; AfterInstall: LoadPer ...

  7. 利用python画出动态高优先权优先调度

    之前写过一个文章. 利用python画出SJF调度图 动态高度优先权优先调度 动态优先权调度算法,以就绪队列中各个进程的优先权作为进程调度的依据.各个进程的优先权在创建进程时所赋予,随着进程的推进或其 ...

  8. 记一次痛苦的Django报错调试经历:

    开发的程序在我的本地mac上,ubuntu上,以及树莓派上都成功实现了迁移和运行,但是当准备将运行好好地程序迁移到阿里云的服务器上的mysql数据库上时,出现了非常多的幺蛾子的问题. 具体如下: 初始 ...

  9. Hyperf基础教程

    前提说明 本教程适用于新手.老手,也适用于任何操作系统,包括Windows.linux.MacOS 介绍 Hyperf 是基于 Swoole 4.4+ 实现的高性能.高灵活性的 PHP 协程框架,内置 ...

  10. 算法竞赛进阶指南--hamilton路径

    // hamilton路径 int f[1 << 20][20]; int hamilton(int n, int weight[20][20]) { memset(f, 0x3f, si ...