golang并发模式work
1 work.go
package work
import (
"sync"
)
type Worker interface { //定义接口,需实现Task()函数
Task()
}
type Pool struct {
work chan Worker //通道,发送worker
wg sync.WaitGroup
}
func New(maxGoroutines int) *Pool {
p := Pool {
work :make(chan Worker),
}
p.wg.Add(maxGoroutines)
for i := 0; i< maxGoroutines; i++ {
go func(){
for w := range p.work { //这种方式从一个chan中取东西, select 是从多个chan中取东西,如果没有则阻塞,只有在通道被关闭时才会终止循环
w.Task() //执行
}
p.wg.Done()
}() //多协程运行,
}
return &p
}
func (p *Pool) Run(w Worker){ //向通道发送work,线程运行
p.work<-w
}
func (p* Pool) Shutdown(){
close(p.work) //关闭通道,线程退出循环
p.wg.Wait() //等待线程终止
}
2 main.go
package main
import (
"log"
"sync"
"time"
"ch7/work"
)
var names = [] string {
"steve",
"bob",
"mary",
"therese",
"jason",
}
type namePrinter struct {
name string
}
func (m *namePrinter) Task(){ //实现work接口
log.Println(m.name)
time.Sleep(time.Second)
}
func main() {
p := work.New(2)
var wg sync.WaitGroup
wg.Add(100 * len(names)) //使用100 * len(names)个协程发送work
for i := 0 ;i< 100; i++ {
for _, name := range names {
np := namePrinter {
name: name,
}
go func(){
p.Run(&np) //向通道发送np,因为是阻塞通道,只有接收后才会返回
wg.Done()
}()
}
}
wg.Wait() //等待发送协程完毕
p.Shutdown() //关闭通道
}
golang并发模式work相关推荐
- Golang并发模式基础
for-select循环 最基本的模式: for {select {case condition 1:// ...case condition 2:// ...case condition n:// ...
- Golang并发模式--channel高级使用
or-done channel 再pipeline的情况中,我们通过done来通知goroutine结束.但是,如果我们处理的channel来自系统其它分散的部分,则无法通过done来控制,因为我们不 ...
- Golang并发模式--管线
管线 管线的作用类似于linux的管道,我们利用channel把数据一级级的传递,最终获取数据的结果.管线适用于流处理的方式,而非批处理:流处理可以实时的获取数据. 给出最基础的管线示例,串联加法器和 ...
- Golang并发模型:轻松入门流水线FAN模式
前一篇文章<Golang并发模型:轻松入门流水线模型>,介绍了流水线模型的概念,这篇文章是流水线模型进阶,介绍FAN-IN和FAN-OUT,FAN模式可以让我们的流水线模型更好的利用Gol ...
- Golang并发模型:轻松入门协程池
goroutine是非常轻量的,不会暂用太多资源,基本上有多少任务,我们可以开多少goroutine去处理.但有时候,我们还是想控制一下. 比如,我们有A.B两类工作,不想把太多资源花费在B类务上,而 ...
- Golang并发模型:合理退出并发协程
goroutine作为Golang并发的核心,我们不仅要关注它们的创建和管理,当然还要关注如何合理的退出这些协程,不(合理)退出不然可能会造成阻塞.panic.程序行为异常.数据结果不正确等问题.这篇 ...
- Golang并发:再也不愁选channel还是选锁
周末又到了,为大家准备了一份实用干货:如何使用channel和Mutex解决并发问题,利用周末的好时光,配上音乐,思考一下吧?. 来,问自己个问题:面对并发问题,是用channel解决,还是用Mute ...
- Go语言中常见的并发模式
Go语言最吸引人的地方是它内建的并发支持.Go语言并发体系的理论是C.A.R Hoare在1978年提出的通信顺序进程(Communicating Sequential Process,CSP).CS ...
- golang 并发同步(sync 库)-- 单例模式的实现(六)
文章目录 golang 单例模式 非线程安全的单例模式 加锁的单例模式 sync.Once 更优雅的方式实现单例模式 更优雅的方式防止主 go 程提前退出 sync.Cond--golang 指挥家 ...
- 第09章 Go语言并发,Golang并发
并发指在同一时间内可以执行多个任务.并发编程含义比较广泛,包含多线程编程.多进程编程及分布式程序等.本章讲解的并发含义属于多线程编程. Go 语言通过编译器运行时(runtime),从语言上支持了并发 ...
最新文章
- Deepfake这次不换脸了,直接换了座城市
- 虚拟机的性能监控与故障处理——jps,jstat,jinfo,jmap,jhat,jstack
- IntelliJ IDEA 2019.3要起飞了,主要解决这些痛点...
- 每日英语:Apple Unveils New iPads
- Linux CAN 驱动实验
- webService返回自定义类型的数据处理
- python文件命名 数字_python 批量修改数字类的文件名
- 集合源码(一)之hashMap、ArrayList
- 仿视频字幕弹幕网站 – Miko二次元动漫视频网站源码 视频播放带源码
- Splines(样条曲线)
- window media player 内部应用程序出错
- web服务器遭受命令注入攻击怎么办。
- Xilinx ZCU106开发详解(Xilinx Zynq UltraScale+ MPSoC)
- 船舶物资与市场杂志船舶物资与市场杂志社船舶物资与市场编辑部2022年第7期目录
- Windows MVSC编译器实现Xtended Flow Guard(XFG)保护机制的原理分析
- Instagram帐户几种不同类型的封号情况及解决方案
- Grip编辑器增强版(UG二次开发工具,最好用的Grip编辑器,没有之一)
- linux7.5开放端口,Centos/linux开放端口
- COTS应用程序开发框架简介(三)
- 二维和三维CAD设计Autodesk AutoCAD 2021