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语言也是可以面向对象的,也是可以应用设计模式的,关键就在于如何实现面向对象语言的三个重要属性. ( ...
随机推荐
- 关于c# winform 键盘响应右边键盘消息响应事件的上下左右方向键没有反应
原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/11835642.html 记录一下这个小坑,c# winform 键盘响应右边键盘的上下左右方向 ...
- tesseract-OCR + pytesseract安装
1. tesseract-OCR下载安装 地址:https://digi.bib.uni-mannheim.de/tesseract/ 选择一个版本下载,下载完成点击**.exe进行安装,若无其他需求 ...
- Toggle the WinForms Ribbon Interface 切换 WinForms 功能区界面
In this lesson, you will learn how to enable/disable the Ribbon User Interface in your application. ...
- windows下安装了2个python,如何下载模块到不同的python中
修改python名称即可,修改Scrpit下的pip名称即可,用不同的名称打开就行 https://www.cnblogs.com/legend-123/p/11195706.html
- Virtual Box复制虚拟机
用惯了VM换BOX还是有点不大一样的,比如复制 我用了2个网卡,所以看起来麻烦了一次 注释了UUID 应该有更好的办法来操作,下面的看起来有点啰嗦,先凑合着这样弄... 1.关机 2.复制 3.改名称 ...
- Drawable.SetDither(Boolean) Method
https://docs.microsoft.com/zh-cn/dotnet/api/android.graphics.drawables.drawable.setdither?view=xamar ...
- 2019年跨越速递Java工程师笔试题
1.下面哪个选项可以用于JSP页面之间传递对象(A C) A application B page C session D error E response 评语:这道题考察的是对JSP内置对象的了 ...
- 集合系列 Set(七):LinkedHashSet
LinkedHashSet 继承了 HashSet,在此基础上维护了元素的插入顺序. public class LinkedHashSet<E> extends HashSet<E& ...
- Docker Compose file
1. Service configuration Compose file 是一个YAML文件,用于定义 services, networks, 和 volumes.其默认路径是./docker-c ...
- 一起学Android之Handler
概述 在Android开发中,有主线程(UI线程)和工作线程(Worker线程)之分,两个线程是相互独立的,并不能相互访问(主线程主要负责UI的更新,不能进行耗时的操作,工作线程主要负责耗时的操作,但 ...