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相关推荐

  1. Golang并发模式基础

    for-select循环 最基本的模式: for {select {case condition 1:// ...case condition 2:// ...case condition n:// ...

  2. Golang并发模式--channel高级使用

    or-done channel 再pipeline的情况中,我们通过done来通知goroutine结束.但是,如果我们处理的channel来自系统其它分散的部分,则无法通过done来控制,因为我们不 ...

  3. Golang并发模式--管线

    管线 管线的作用类似于linux的管道,我们利用channel把数据一级级的传递,最终获取数据的结果.管线适用于流处理的方式,而非批处理:流处理可以实时的获取数据. 给出最基础的管线示例,串联加法器和 ...

  4. Golang并发模型:轻松入门流水线FAN模式

    前一篇文章<Golang并发模型:轻松入门流水线模型>,介绍了流水线模型的概念,这篇文章是流水线模型进阶,介绍FAN-IN和FAN-OUT,FAN模式可以让我们的流水线模型更好的利用Gol ...

  5. Golang并发模型:轻松入门协程池

    goroutine是非常轻量的,不会暂用太多资源,基本上有多少任务,我们可以开多少goroutine去处理.但有时候,我们还是想控制一下. 比如,我们有A.B两类工作,不想把太多资源花费在B类务上,而 ...

  6. Golang并发模型:合理退出并发协程

    goroutine作为Golang并发的核心,我们不仅要关注它们的创建和管理,当然还要关注如何合理的退出这些协程,不(合理)退出不然可能会造成阻塞.panic.程序行为异常.数据结果不正确等问题.这篇 ...

  7. Golang并发:再也不愁选channel还是选锁

    周末又到了,为大家准备了一份实用干货:如何使用channel和Mutex解决并发问题,利用周末的好时光,配上音乐,思考一下吧?. 来,问自己个问题:面对并发问题,是用channel解决,还是用Mute ...

  8. Go语言中常见的并发模式

    Go语言最吸引人的地方是它内建的并发支持.Go语言并发体系的理论是C.A.R Hoare在1978年提出的通信顺序进程(Communicating Sequential Process,CSP).CS ...

  9. golang 并发同步(sync 库)-- 单例模式的实现(六)

    文章目录 golang 单例模式 非线程安全的单例模式 加锁的单例模式 sync.Once 更优雅的方式实现单例模式 更优雅的方式防止主 go 程提前退出 sync.Cond--golang 指挥家 ...

  10. 第09章 Go语言并发,Golang并发

    并发指在同一时间内可以执行多个任务.并发编程含义比较广泛,包含多线程编程.多进程编程及分布式程序等.本章讲解的并发含义属于多线程编程. Go 语言通过编译器运行时(runtime),从语言上支持了并发 ...

最新文章

  1. Deepfake这次不换脸了,直接换了座城市
  2. 虚拟机的性能监控与故障处理——jps,jstat,jinfo,jmap,jhat,jstack
  3. IntelliJ IDEA 2019.3要起飞了,主要解决这些痛点...
  4. 每日英语:Apple Unveils New iPads
  5. Linux CAN 驱动实验
  6. webService返回自定义类型的数据处理
  7. python文件命名 数字_python 批量修改数字类的文件名
  8. 集合源码(一)之hashMap、ArrayList
  9. 仿视频字幕弹幕网站 – Miko二次元动漫视频网站源码 视频播放带源码
  10. Splines(样条曲线)
  11. window media player 内部应用程序出错
  12. web服务器遭受命令注入攻击怎么办。
  13. Xilinx ZCU106开发详解(Xilinx Zynq UltraScale+ MPSoC)
  14. 船舶物资与市场杂志船舶物资与市场杂志社船舶物资与市场编辑部2022年第7期目录
  15. Windows MVSC编译器实现Xtended Flow Guard(XFG)保护机制的原理分析
  16. Instagram帐户几种不同类型的封号情况及解决方案
  17. Grip编辑器增强版(UG二次开发工具,最好用的Grip编辑器,没有之一)
  18. linux7.5开放端口,Centos/linux开放端口
  19. COTS应用程序开发框架简介(三)
  20. 二维和三维CAD设计Autodesk AutoCAD 2021

热门文章

  1. 建议65:总是处理未捕获的异常
  2. RPG游戏制作-03-人物行走及A*寻路算法
  3. JavaScript 移动端点击事件延迟问题
  4. 分布式系统三大指标:可扩展性、一致性、持久性
  5. VUE前端应用部署页面访问404问题
  6. 你真的了解什么是冒烟测试么?
  7. 线段最大重合问题:最多有多少条线段是重合的
  8. python名片打印程序_Python的格式化输出--制作名片
  9. dell服务器更换硬盘raid,DELL T620服务器硬盘坏,更换硬盘做RAID同步
  10. react native Android 手机摇一摇与菜单键无效