[Go] golang缓冲通道实现管理一组goroutine工作
通道
1.当一个资源需要在goroutine之间共享时,通道在goroutine之间架起了一个管道
2.无缓冲通道和有缓冲通道,make的第二个参数就是缓冲区大小
3.无缓冲通道需要发送和接收都准备好,否则先执行的goroutine会阻塞等待
4.有缓冲的通道,在缓冲区没满之前,发送和接收动作都不会阻塞,空的时候接收才会阻塞
time.Now().Unix() 当前时间戳 time.Millisecond 毫秒
time.Sleep(1 * time.Second) 睡眠一秒
package main import (
"fmt"
"math/rand"
"sync"
"time"
) const (
//全局常量
numberGoroutines = 4 //使用goroutine的数量
taskLoad = 10 //要处理的工作量
) var wg sync.WaitGroup //init函数会在main之前执行
func init() {
//初始化随机数
rand.Seed(time.Now().Unix())
}
func main() {
//创建有缓冲的通道管理,缓冲区是10
tasks := make(chan string, taskLoad) //启动4个goroutines来处理工作
wg.Add(numberGoroutines) //加入计数信号量
for i := 1; i <= numberGoroutines; i++ {
go worker(tasks, i)
} //主goroutine将10个字符串发送到通道,模拟分发给子goroutine的工作
for j := 1; j <= taskLoad; j++ {
tasks <- fmt.Sprintf("Task: %d", j)
}
//发送完成后,把通道关闭
close(tasks)
//如果一直往通道塞,子goroutine就可以一直工作,可以当队列用
// for {
// tasks <- fmt.Sprintf("Task: %d", rand.Int63n(10000000000))
// } //等待所有goroutines完成
wg.Wait()
} //处理工作
func worker(tasks chan string, worker int) {
defer wg.Done()
//无限循环处理接收到的工作,可以处理完一个以后继续处理下一个
for {
//从已经关闭的通道中,依然可以接收数据,并且返回一个通道类型的零值,如果一个都没接收到的时候会阻塞
//接收到一个以后,会继续往下执行
task, ok := <-tasks
//判断通道是否清空并关闭
if !ok {
fmt.Printf("Worker: %d:关闭\n", worker)
//直接退出这个goroutine
return
}
//正式开始工作
fmt.Printf("Worker: %d:开始工作\n", worker)
//用随机睡眠来模拟执行中
sleep := rand.Int63n(100)
time.Sleep(time.Duration(sleep) * time.Millisecond)
//显示完成了
fmt.Printf("Worker: %d :完成 %s \n", worker, task)
}
}

[Go] golang缓冲通道实现管理一组goroutine工作的更多相关文章
- [Go] golang缓冲通道实现资源池
go的pool资源池:1.当有多个并发请求的时候,比如需要查询数据库2.先创建一个2个容量的数据库连接资源池3.当一个请求过来的时候,去资源池里请求连接资源,肯定是空的就创建一个连接,执行查询,结束后 ...
- golang中为何在同一个goroutine中使用无缓冲通道会导致死锁
package main import "fmt" func main() { /* 以下程序会导致死锁 c := make(chan int) c <- 10 n1 := ...
- golang channel无缓冲通道会发生阻塞的验证
公司搞了午间技术par,本周我讲的主题是关于无缓冲通道channel是否会发生阻塞,并进行了验证. go语言中channel分为无缓冲通道和有缓冲通道两种 channel提供了一种在goroutine ...
- [Go] golang无缓冲通道实现工作池控制并发
展示如何使用无缓冲的通道创建一个goroutine池,控制并发频率1.无缓冲通道保证了两个goroutine之间的数据交换2.当所有的goroutine都忙的时候,能够及时通过通道告知调用者3.无缓冲 ...
- Golang并发编程有缓冲通道和无缓冲通道(channel)
无缓冲通道 是指在接收前没有能力保存任何值得通道.这种类型的通道要求发送goroutine和接收goroutine同时准备好,才能完成发送和接收操作.如果两个goroutine没有同时准备好,通道会导 ...
- Go语言的通道(2)-缓冲通道
有缓冲的通道相比于无缓冲通道,多了一个缓存的功能,如下图描述的一样: 从图上可以明显看到和无缓冲通道的区别,无缓冲必须两个Goroutine都进入通道才能进行数据的交换,这个不用,如果数据有,直接就能 ...
- Go语言的通道(1)-无缓冲通道
前言: 上文中我们采用了[原子函数]已经[共享锁]两种方式分别对多个goroutine进行了同步,但是在go语言中提供了另一种更好的方式,那就是使用通道(Channel). 一.通道是什么? 其实无论 ...
- 美团Java团队分享:如何实践支付通道自动化管理
随着支付业务量激增,支付团队不断壮大.为了满足日益增长的业务需求,大量的支付通道逐渐接入,但由于对接的各银行和第三方系统的稳定性参差不齐,支付通道故障时有发生,作为承接上下游的核心系统,要在一系列不稳 ...
- 6、LwIP协议规范翻译——缓冲及内存管理
6.缓冲及内存管理 在一个通信系统中,内存缓冲管理系统必须容纳各种大小的缓冲数据,其范围从包含具有数百个字节的数据的全尺寸TCP段到只有几个字节的短ICMP回复包.此外,为了避免拷贝,应该让数据内容缓 ...
随机推荐
- echarts (geo/map) 渐变效果
这两天帮人搞了下中国范围内仓库量统计的需求,查了下echarts 里的文档找到类似的demo(链接:https://ecomfe.github.io/echarts-examples/public/e ...
- Oracle 闪回 找回数据
使用闪回技术,实现基于磁盘上闪回恢复区的自动备份与还原. 一.恢复表对象 1.创建学生表 create table STUDENT ( idno INTEGER, name VARCHAR2(30), ...
- 网页开发--03(wampserver安装服务无法启动的问题)
一.安装wampserver 一路next,指定安装路径外,其它默认安装. 二.我遇到的问题 当任务图标绿色为正常启动状态,但是我的从打开一直是黄色,问题在于Apache和MySql 1)Apache ...
- Lesson 28 No parking
Text Jasper White is one of those rare people who believes in ancient myths. He has just bought a ne ...
- 大数据与云计算的关系是什么,Hadoop又如何参与其中?Nosql在什么位置,与BI又有什么关系?
大数据与云计算的关系是什么,Hadoop又如何参与其中,Nosql在什么位置,与BI又有什么关系?以下这篇文字讲他们的关系讲的非常清楚. 在谈大数据的时候,首先谈到的就是大数据的4V特性,即类型复杂 ...
- [Swift]LeetCode883. 三维形体投影面积 | Projection Area of 3D Shapes
On a N * N grid, we place some 1 * 1 * 1 cubes that are axis-aligned with the x, y, and z axes. Each ...
- [Swift]LeetCode930. 和相同的二元子数组 | Binary Subarrays With Sum
In an array A of 0s and 1s, how many non-empty subarrays have sum S? Example 1: Input: A = [1,0,1,0, ...
- mysql之delete语法
一:DELETE语法 以往用delect删除表数据是都是单表(一个表)删除.对于关联表,往往都是先删除第一个表的数据,然后再写另一个delect语句删除另一个表的数据(浪费时间,又影响性能,与数据库交 ...
- Java核心技术及面试指南 多线程并发部分的面试题总结以及答案
7.2.10.1有T1.T2.T3三个线程,如何保证T2在T1执行完后执行,T3在T2执行完后执行? 用join语句,在t3开始前join t2,在t2开始前join t1. 不过,这会破坏多线程的并 ...
- npm私有仓库 配置verdaccio在docker环境
前端开发过程中,少不了自己封装一些通用的包,但又不想放在公共的平台,所以搭建一个npm私有的仓库是很有必要的. 在这里简单介绍如何使用 verdoccio 在docker环境下的配置.verdocci ...