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语言也是可以面向对象的,也是可以应用设计模式的,关键就在于如何实现面向对象语言的三个重要属性. ( ...
随机推荐
- 使用函数计算三步实现深度学习 AI 推理在线服务
目前深度学习应用广发, 其中 AI 推理的在线服务是其中一个重要的可落地的应用场景.本文将为大家介绍使用函数计算部署深度学习 AI 推理的最佳实践, 其中包括使用 FUN 工具一键部署安装第三方依赖 ...
- arcgis api 4.x for js 结合 Echarts4 实现统计图(附源码下载)
前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 4.x for js:esri 官网 api,里面详细的介绍 arcgis api 4.x 各个类 ...
- centos7设置服务开机自启
1.在/usr/lib/systemd/system/路径下创建文件 ***.service. 写入如下内容 [Unit]Description=nginxAfter=network.target [ ...
- windows命令行pip报错解决的方法
今天在新电脑安装python,发现pip无效了,于是乎百度了很多方法,发现原因是pip升级导致的 解决办法,卸载pip重新安装 可以首先执行 python -m ensurepip 然后执行 py ...
- 08-Django 模板
需要教程的请关注个人微信公众号 模板:产生html,用于控制页面的展示,模板不仅仅是一个html文件,它包含两部分内容: 静态内容:css,js,image 动态内容:用模板语言语言动态的产生一些网页 ...
- 32(2).层次聚类---BIRCH
BIRCH:Balanced Iterative Reducing and Clustering Using Hierarchies 算法通过聚类特征树CF Tree:Clustering Featu ...
- [译]Vulkan教程(11)Image Views
Image views To use any VkImage, including those in the swap chain, in the render pipeline we have to ...
- 关于java中三种初始化块的执行顺序
许多小伙伴对于java中的三种初始化块的执行顺序一直感到头疼,接下来我们就来分析一下这三种初始化块到底是怎么运行的.有些公司也会将这个问题作为笔试题目. 下面通过一段代码来看看创建对象时这么初始化块是 ...
- 第2次作业-titanic数据集练习
一.读入titanic.xlsx文件,按照教材示例步骤,完成数据清洗. titanic数据集包含11个特征,分别是: Survived:0代表死亡,1代表存活Pclass:乘客所持票类,有三种值(1, ...
- HttpModules配置事项
前沿:还是那句话 ASP.NET管道,浏览器 - isAPI32.dll - HttpModules - HttpHandler - 返回客户端Web.Config:<httpModules&g ...