Golang中WaitGroup、Context、goroutine定时器及超时学习笔记
原文连接:http://targetliu.com/2017/5/2...
好久没有发过文章了 - -||,今天发一篇golang
中goroutine
相关的学习笔记吧,以示例为主。
WaitGroup
WaitGroup
在 sync
包中,用于阻塞主线程执行直到添加的 goroutine
全部执行完毕。
Context
Context
包不仅实现了在程序单元之间共享状态变量的方法,同时能通过简单的方法,使我们在被调用程序单元的外部,通过设置ctx变量值,将过期或撤销这些信号传递给被调用的程序单元。
goroutine的定时器及超时
这是两个有趣又实用的功能,在标准库 time
包里提供。
示例
源码
<!--more-->
package mainimport ("context""fmt""sync""time"
)func main() {ch := make(chan int)//定义一个WaitGroup,阻塞主线程执行var wg sync.WaitGroup//添加一个goroutine等待wg.Add(1)//goroutine超时go func() {//执行完成,减少一个goroutine等待defer wg.Done()for {select {case i := <-ch:fmt.Println(i)//goroutine内部3秒超时case <-time.After(3 * time.Second):fmt.Println("goroutine1 timed out")return}}}()ch <- 1//新增一个1秒执行一次的计时器ticker := time.NewTicker(1 * time.Second)defer ticker.Stop()//新增一个10秒超时的上下文background := context.Background()ctx, _ := context.WithTimeout(background, 10*time.Second)//添加一个goroutine等待wg.Add(1)go func(ctx context.Context) {//执行完成,减少一个goroutine等待defer wg.Done()for {select {//每秒一次case <-ticker.C:fmt.Println("tick")//内部超时,不会被执行case <-time.After(5 * time.Second):fmt.Println("goroutine2 timed out")//上下文传递超时信息,结束goroutinecase <-ctx.Done():fmt.Println("goroutine2 done")return}}}(ctx)//等待所有goroutine执行完成wg.Wait()
}
执行结果
1
tick
tick
tick
goroutine1 timed out
tick
tick
tick
tick
tick
tick
tick
goroutine2 done
Golang中WaitGroup、Context、goroutine定时器及超时学习笔记相关推荐
- Golang中WaitGroup使用的一点坑
Golang中WaitGroup使用的一点坑 Golang 中的 WaitGroup 一直是同步 goroutine 的推荐实践.自己用了两年多也没遇到过什么问题.直到一天午睡后,同事扔过来一段奇怪的 ...
- SVO中 Inverse Compositional Image Alignment方法的学习笔记
SVO中 Inverse Compositional Image Alignment方法的学习笔记 这篇文章 光流法简介 逆向光流法 结尾 这篇文章 在SVO系统中的"Relaxation ...
- 深入理解Golang中的Context包
context.Context是Go语言中独特的设计,在其他编程语言中我们很少见到类似的概念.context.Context深度支持Golang的高并发. 1. Goroutine和Channel 在 ...
- java中预编译是啥意思_JAVA学习笔记预编译
JAVA学习笔记预编译 (2011-07-30 02:36:17) 标签: 杂谈 第顺次运行jsp时jsp将被改换成servlet(第顺次工夫较长,而尔后就会快许多) 搭配好的利用过程能够穿越设置js ...
- python中socket模块常用吗_python网络学习笔记——socket模块使用记录
此文章记录了笔者学习python网络中socket模块的笔记. 建议初次学习socket的读者先读一遍socket模块主要函数的介绍. socket模块的介绍可以参考笔者的前一篇关于socket官方文 ...
- mysql循环查询一个表中的数据并进行修改_JavaScript学习笔记(二十四)-- MYSQL基础操作...
MYSQL mysql 是一个数据库的名字 和 php 合作的比较好的数据库 之前我们说过一个问题,前端向后端索要数据,后端就是去数据库中查询数据,返回给前端 接下来就聊聊使用 php 操作数据库 M ...
- c语言中否则指令不能用,C语言学习笔记
此文章为个人学习时记录笔记,顺便试试MarkDown,不是教程-. C语言学习笔记 Mac系统的使用 Finder 文件管理系统 Dock 快捷栏 系统偏好设置 Safari浏览器 App Store ...
- shell中文件路径用变量定义_shell学习笔记01(概述amp;变量)
Shell概述 为什么要学习Shell呢? 因为有用. Shell脚本入门 1.脚本格式 脚本以#!/bin/bash开头(指定解析器) 2.第一个Shell脚本:helloworld (1)需求:创 ...
- mysql中10049是什么错误_【学习笔记】Oracle数据库10049用于分析SQL解析笔记案例
[学习笔记]Oracle数据库10049用于分析SQL解析笔记案例 时间:2016-11-05 13:54 来源:Oracle研究中心 作者:HTZ 点击: 次 天萃荷净 Oracle研究 ...
最新文章
- 发现一个有意思的博主(科研工作者)
- R语言实现金融数据的时间序列分析及建模
- 【Android 逆向】Linux 文件分类 ( 普通文件 | 目录文件 | 链接文件 | 字符设备文件 | 管道文件 | 块设备文件 )
- 【haproxy初始化】init_haproxy.sh
- java多个类调用,java起用多进程调用某个类(是class文件)
- 博客园jquery专题
- [C++]指针与引用(应用辨析)
- 《维C中国》乡村助农暖人心第三站嘉宝果农场
- 班级网站java_基于jsp的班级网站-JavaEE实现班级网站 - java项目源码
- Xcode6 新特性
- HTMLCSS仿京东注册页面制作静态页面总结
- 阿里云安全防护是如何做到的?有怎样的安全生态圈
- 虚拟环境Vmware下改变Linux(CentOS7)IP地址
- GAMES101现代计算机图形学入门——几何表示之曲线与曲面
- NOAA(美国国家海洋和大气管理局)逐月数据下载文件之官方说明文档(GSOM)
- 如何预防AV终结者病毒
- 中国社科发布:十大知名调查研究咨询公司
- Zend Framework教程-Zend_View
- Elasticsearch插件管理(ik分词器、附件文本抽取插件)
- php get微信接口乱码,php版本微信公众平台回复乱码问题解决方法
热门文章
- 不要直接对Request.Headers[If-Modified-Since]使用Convert.ToDateTime
- 阿里云服务器下安装LAMP环境(CentOS Linux 6.3) 安装与配置 Apache 服务
- 转 carrer 之感
- C# 打开指定的文件夹 记住路径中 / 与 \ 的用法
- 通信网络安全分层及关键技术解决
- opencv,用摄像头识别贴片元件的定位和元件的角度(转载)
- Git for Windows之推送本地版本库到远程仓库
- shell 变量相关的命令
- Android为TV端助力 转载:android自定义view实战(温度控制表)!
- 根据上边栏和下边栏的高度进行布局