go语言设计模式之Concurrency workers pool
worker.go
package main import ( "fmt" "strings" ) type WorkerLauncher interface { LaunchWorker(in chan Request) } type PreffixSuffixWorker struct { id int prefixS string suffixS string } func (w *PreffixSuffixWorker) LaunchWorker(in chan Request) { w.prefix(w.append(w.upperCase(in))) } func (w *PreffixSuffixWorker) upperCase(in <-chan Request) <-chan Request { out := make(chan Request) go func() { for msg := range in { s, ok := msg.Data.(string) if !ok { msg.handler(nil) continue } msg.Data = strings.ToUpper(s) out <- msg } close(out) }() return out } func (w *PreffixSuffixWorker) append(in <-chan Request) <-chan Request { out := make(chan Request) go func() { for msg := range in { uppercaseString, ok := msg.Data.(string) if !ok { msg.handler(nil) continue } msg.Data = fmt.Sprintf("%s%s", uppercaseString, w.suffixS) out <- msg } close(out) }() return out } func (w *PreffixSuffixWorker) prefix(in <-chan Request) { go func() { for msg := range in { uppercasedStringWithSuffix, ok := msg.Data.(string) if !ok { msg.handler(nil) continue } msg.handler(fmt.Sprintf("%s%S", w.prefixS, uppercasedStringWithSuffix)) } }() }
dispatcher.go
package main import ( "time" ) type Dispatcher interface { LaunchWorker(w WorkerLauncher) MakeRequest(Request) Stop() } type dispatcher struct { inCh chan Request } func (d *dispatcher) LaunchWorker(w WorkerLauncher) { w.LaunchWorker(d.inCh) } func (d *dispatcher) Stop() { close(d.inCh) } func (d *dispatcher) MakeRequest(r Request) { select { case d.inCh <- r: case <-time.After(time.Second * 5): return } } func NewDispatcher(b int) Dispatcher { return &dispatcher{ inCh: make(chan Request, b), } }
workers_pipeline.go
package main import ( "fmt" "log" "sync" ) type RequestHandler func(interface{}) type Request struct { Data interface{} handler RequestHandler } func NewStringRequest(s string, id int, wg *sync.WaitGroup) Request { myRequest := Request{ Data: "Hello", handler: func(i interface{}) { defer wg.Done() s, ok := i.(string) if !ok { log.Fatal("Invalid casting to string") } fmt.Println(s) }, } return myRequest } func main() { bufferSize := 100 var dispatcher Dispatcher = NewDispatcher(bufferSize) workers := 3 for i := 0; i < workers; i++ { var w WorkerLauncher = &PreffixSuffixWorker{ prefixS: fmt.Sprintf("WorkerID: %d -> ", i), suffixS: " World", id: i, } dispatcher.LaunchWorker(w) } requests := 10 var wg sync.WaitGroup wg.Add(requests) for i := 0; i < requests; i++ { req := NewStringRequest("(MSG_ID: %d) -> Hello", i, &wg) dispatcher.MakeRequest(req) } dispatcher.Stop() wg.Wait() }
go语言设计模式之Concurrency workers pool的更多相关文章
- go语言设计模式之Concurrency pipeline
pipeline.go package pipeline func LaunchPipeline(amount int) int { firstCh := generator(amount) seco ...
- go语言设计模式之Concurrency future
future.go package future type SuccessFunc func(string) type FailFunc func(error) type ExecuteStringF ...
- go语言设计模式之Concurrency barrier
barrier.go package barrier import ( "fmt" "io/ioutil" "net/http" " ...
- Go语言设计模式之函数式选项模式
Go语言设计模式之函数式选项模式 本文主要介绍了Go语言中函数式选项模式及该设计模式在实际编程中的应用. 为什么需要函数式选项模式? 最近看go-micro/options.go源码的时候,发现了一段 ...
- C语言设计模式-封装-继承-多态
快过年了,手头的工作慢慢也就少了,所以,研究技术的时间就多了很多时间,前些天在CSDN一博客看到有大牛在讨论C的设计模式,正好看到了,我也有兴趣转发,修改,研究一下. 记得读大学的时候,老师就告诉我们 ...
- Go语言设计模式实践:迭代器(Iterator)
关于本系列 决定开个新坑. 这个系列首先是关于Go语言实践的.在项目中实际使用Go语言也有段时间了,一个体会就是不论是官方文档.图书还是网络资料,关于Go语言惯用法(idiom)的介绍都比较少,基本只 ...
- Go语言设计模式实践:组合(Composite)
关于本系列 这个系列首先是关于Go语言实践的.在项目中实际使用Go语言也有段时间了,一个体会就是不论是官方文档.图书还是网络资料,关于Go语言惯用法(idiom)的介绍都比较少,基本只能靠看标准库源代 ...
- Go语言设计模式汇总
目录 设计模式背景和起源 设计模式是什么 Go语言模式分类 个人观点 Go语言从面世就受到了业界的普遍关注,随着区块链的火热Go语言的地位也急速蹿升,为了让读者对设计模式在Go语言中有一个初步的了解和 ...
- C语言设计模式
一 .C语言和设计模式(继承.封装.多态) C++有三个最重要的特点,即继承.封装.多态.我发现其实C语言也是可以面向对象的,也是可以应用设计模式的,关键就在于如何实现面向对象语言的三个重要属性. ( ...
随机推荐
- Elasticsearch系列---初识Elasticsearch
Elasticsearch是什么? Elasticsearch简称ES,是一个基于Lucene构建的开源.分布式.Restful接口的全文搜索引擎,还是一个分布式文档数据库.天生就是分布式.高可用.可 ...
- C# get folder's Md5 generated by file's and filename's md5. get dictionary md5
C# get dictionary md5 static string GetDicMD5(string dirFullName) { logBuilder = new StringBuilder() ...
- 8道Python基础面试练习题
1.26个字母大小写成对打印,例如:Aa,Bb...... for i in range(26): print(chr(65+i)+chr(97+i)) 2.一个list包含10个数字,然后生成一个新 ...
- tf.nn.in_top_k的用法
tf.nn.in_top_k组要是用于计算预测的结果和实际结果的是否相等,返回一个bool类型的张量,tf.nn.in_top_k(prediction, target, K):prediction就 ...
- SpringMVC框架之第二篇
6.参数绑定(重点) Springmvc作为表现层框架,是连接页面和service层的桥梁,它负责所有请求的中转.怎么从请求中接收参数是重点,这也体现了我们刚开始说的Springmvc的第一个作用:“ ...
- Android 项目优化(一):项目代码规范优化
项目代码规范为主要包含:类,常量,变量,ID等命名规范:注释规范:分包规范:代码风格规范. 项目代码规范是软件开发过程中非常重要的优化环节. 目前的开发社区提供了很多的开发规范文档,阿里巴巴推出了&l ...
- QT执行shell脚本或者执行linux指令
由于我在做linux下的QT开发,有时候会用到shell脚本的辅助,但是需要QT运行shell脚本并获取执行结果,今天给大家分享下我的技巧,废话少说直接上代码: //执行shell指令或者shell脚 ...
- 023.[转] 尚硅谷_Maven笔记
- 原生js放大镜效果
效果: 1. 鼠标放上去会有半透明遮罩.右边会有大图片局部图 2. 鼠标移动时右边的大图片也会局部移动 放大镜的关键原理: 鼠标在小图片上移动时,通过捕捉鼠标在小图片上的位置,定位大图片的相应位置 ...
- flutter---安装教程
下载java jdk https://www.oracle.com/technetwork/java/javase/downloads/jdk13-downloads-5672538.html 下载 ...