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 ...
随机推荐
- Windows10+Python3+BeautifulSoup4 安装
用正则表达式来提取网页中的内容是相当麻烦的,这里介绍一个可以从HTML或XML文件中提取数据的Python库:Beautiful Soup.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的 ...
- day06(Collection,List,ArrayList,LinkedList,iterator迭代器,增强for)
Collection 接口 方法实现 boolean add(Object o);//添加 boolean remove(Object o);//移除 修改方法 让实现类自己去实现修 ...
- Codeforces 706C Hard problem 2016-09-28 19:47 90人阅读 评论(0) 收藏
C. Hard problem time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...
- adb命令行输出logcat日志
输出到终端: adb logcat 输出到指定文件:如log.txt adb logcat > log.txt 输出到指定文件并带上日志产生时的系统时间(个人感觉实用的): adb logcat ...
- 【笔记】virtualbox+arch+kde5安装流水账
正常安装就是RTFD就行了,不行辅助这几个链接也行: 我先把整个脚本[1]放这里: loadkeys us parted mkfs.ext4 /dev/sda1mkfs.ext4 /dev/sda3 ...
- Android-ActionBar-与Menu结合
ActionBar就是一个标题栏,以前Android3.0之前还称为标题栏,Android3.0之后取名为ActionBar 首先必须在AndroidManifest.xml中指定Applicatio ...
- Python学习-35.Python中的List Comprehensions(列表解释|列表生成式)
在某些情况下,我们需要对列表进行某些操作,例如对列表中的每一个元素都乘以2,这样一般来说就是遍历每个元素在乘以2.那么写下来就得两行了.而且这会修改原来的列表,如果要求不能修改原来的列表,又得多一行了 ...
- 查看Linux服务器被映射的公网ip
查看Linux服务器被映射的公网ip 现在云服务器非常流行,不仅企业甚至是个人都可能拥有自己的云服务器,但是目前的云服务器厂商提供的公网IP大都是映射而来,所以在Linux服务器上执行ifconf ...
- 集体智慧编程-discovering groups
这一章讲的是利用聚集算法对blog进行分类. 首先是构造数据,找到一组blog,每个blog包含一组单词.这样就形成了(blog-name, word*)*的数据结构. 在构造该数据结构的过程中,还需 ...
- 设计模式之外观模式(Facade Pattern)
一.什么是外观模式? 简单的说,外观模式是用来简化接口的. 通常,我们觉得一个子系统不好用,可能是因为它提供的外部接口太接近低层组件,让我们用起来感到很麻烦. 因为我们不需要知道内部细节,我们只想要一 ...