golang协程池
const Max = type GoroutinePoll struct {
Queue chan func() error
Total, Num int
Result chan error
FinishCallBack func() error
} func (g *GoroutinePoll) Init(total int) {
g.Total = total
g.Queue = make(chan func() error, total)
g.Result = make(chan error, total)
}
func (g *GoroutinePoll) SetFinishCallBack(f func() error) {
g.FinishCallBack = f
} func (g *GoroutinePoll) Add(f func() error) error {
if len(g.Queue) == g.Total || g.Total == {
return errors.New(" add goroutine fail!")
} g.Queue <- f
g.Num++
return nil
}
func (g *GoroutinePoll) Start() {
for i := ; i < g.Num; i++ {
v, ok := <-g.Queue
if !ok {
break
} go func() {
err := v()
g.Result <- err
}()
} for i := ; i < g.Num; i++ {
err, ok := <-g.Result
if !ok {
break
}
if err != nil {
fmt.Println(err)
}
} if err := g.FinishCallBack(); err != nil {
fmt.Println("执行回调函数失败!", err)
}
} func (g *GoroutinePoll) Close() {
close(g.Queue)
close(g.Result)
}
func main() {
runtime.GOMAXPROCS()
total :=
g := GoroutinePoll{}
g.Init(total)
finshCallBack := func() error {
fmt.Println("callback !")
return nil
}
g.SetFinishCallBack(finshCallBack)
f1 := func() error {
for i := ; i < Max; i++ { } return nil
}
g.Add(f1)
f2 := func() error {
for i := ; i < Max; i++ { }
return nil
}
g.Add(f2)
f3 := func() error {
for i := ; i < Max; i++ { }
return nil
}
g.Add(f3)
f4 := func() error {
for i := ; i < Max; i++ { }
return nil
}
g.Add(f4)
now := time.Now()
g.Start()
g.Close()
fmt.Println(time.Since(now))
now = time.Now()
f1()
f2()
f3()
f4()
fmt.Println(time.Since(now))
}
callback !
3.863554ms
12.890933ms
golang协程池的更多相关文章
- golang协程池设计
Why Pool go自从出生就身带“高并发”的标签,其并发编程就是由groutine实现的,因其消耗资源低,性能高效,开发成本低的特性而被广泛应用到各种场景,例如服务端开发中使用的HTTP服务,在g ...
- Golang协程池(workpool)实现
背景 因与工作相关,所以本文中的数据都进行了更改,但逻辑是一样的. 笔者的服务ServerA会请求服务ServerH获取一些数据,但ServerH的接口有个N秒内只能请求M次的限制,并返回false. ...
- 面试必问:Golang高阶-Golang协程实现原理
引言 实现并发编程有进程,线程,IO多路复用的方式.(并发和并行我们这里不区分,如果CPU是多核的,可能在多个核同时进行,我们叫并行,如果是单核,需要排队切换,我们叫并发) 进程和线程的区别 进程是计 ...
- fasthttp中的协程池实现
fasthttp中的协程池实现 协程池可以控制并行度,复用协程.fasthttp 比 net/http 效率高很多倍的重要原因,就是利用了协程池.实现并不复杂,我们可以参考他的设计,写出高性能的应用. ...
- 【爬虫小程序:爬取斗鱼所有房间信息】Xpath(协程池版)
# 本程序亲测有效,用于理解爬虫相关的基础知识,不足之处希望大家批评指正 from gevent import monkey monkey.patch_all() from gevent.pool i ...
- golang协程同步的几种方法
目录 golang协程同步的几种方法 协程概念简要理解 为什么要做同步 协程的几种同步方法 Mutex channel WaitGroup golang协程同步的几种方法 本文简要介绍下go中协程的几 ...
- python 协程池和pool.map用法
一.问题描述 现在有一段代码,需要扫描一个网段内的ip地址,是否可以ping通. 执行起来效率太慢,需要使用协程. #!/usr/bin/env python # -*- coding: utf-8 ...
- Python与Golang协程异同
背景知识 这里先给出一些常用的知识点简要说明,以便理解后面的文章内容. 进程的定义: 进程,是计算机中已运行程序的实体.程序本身只是指令.数据及其组织形式的描述,进程才是程序的真正运行实例. 线程的定 ...
- Golang协程实现流量统计系统(3)
进程.线程.协程 - 进程:太重 - 线程:上下文切换开销太大 - 协程:轻量级的线程,简洁的并发模式 Golang协程:goroutine Hello world package main impo ...
随机推荐
- (转) MVC 中 @help 用法
ASP.NET MVC 3支持一项名为“Razor”的新视图引擎选项(除了继续支持/加强现有的.aspx视图引擎外).当编写一个视图模板时,Razor将所需的字符和击键数减少到最小,并保证一个快速.通 ...
- HDU6029 Graph Theory 2017-05-07 19:04 40人阅读 评论(0) 收藏
Graph Theory Time Limit: 2000/1000 M ...
- HDU1269 迷宫城堡 2016-07-24 13:47 84人阅读 评论(0) 收藏
迷宫城堡 Problem Description 为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每个通道都是单向的 ...
- 几个经典的数学库之一学习---VCGlib(2)
几个经典的数学库之一学习---VCGlib(2) 1. Optional Component(可选的组件) 有许多Vertex和Face的属性并不是一直都是必要的,如Face-Face的邻接关系.VC ...
- hdu 1284 钱币兑换
题目 我们用dp[n]表示用这些硬币组成n的方法总数.... 然后随着硬币种类的增加来更新dp[]的值,也就是最外面的一层循环for(i :1-->3)开始初始化的时候没有硬币,然后新来了面值为 ...
- How To Change the Supplier Bank Account Masking in UI (Doc ID 877074.1)
Give Feedback... How To Change the Supplier Bank Account Masking in UI (Doc ID 877074.1) ...
- Unidac连接出错:命名管道提供程序:管道的另一端上无任何进程.
环境: DELPHI XE ,UniDAC 6.2.8, (Options->Provider=prNativeClient) 程序编译后,放在Windows Server 2003 (sp2 ...
- Facebook支撑万亿Post搜索背后的技术窥探
转自http://www.csdn.net/article/2013-10-29/2817333-under-the-hood-building-posts-search 近日,Facebook为po ...
- python3字符集之间--encode与decode之间的转码详解
encode是编码,里面传入的参数是需要转成的字符集,decode是解码,里面传入的参数是本身的字符集,用本身的字符集解码为unicode字符集再转码 字符集之间的爱恨纠缠 # -*- coding: ...
- WPF点滴(2) 创建单实例应用程序
最近有同事问道在应用程序启动之后,再次双击应用程序,如何保证不再启动新的应用程序,而是弹出之前已经启动的进程,本质上这就是创建一个单实例的WPF应用程序.在VS的工程树中有一个App.xaml和App ...