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 ...
随机推荐
- (线段树)Mayor's posters --poj -- 2528
链接: http://poj.org/problem?id=2528 覆盖问题, 要从后往前找, 如果已经被覆盖就不能再覆盖了,否则就可以覆盖 递归呀递归什么时候我才能吃透你 代码: #include ...
- (匹配)Oil Skimming -- hdu --4185
链接: http://acm.hdu.edu.cn/showproblem.php?pid=4185 http://acm.hust.edu.cn/vjudge/contest/view.action ...
- 分离 桂林电子科技大学第三届ACM程序设计竞赛
链接:https://ac.nowcoder.com/acm/contest/558/H 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言5242 ...
- matlab的特殊字符(上下标和希腊字母等)
'T=25\circC',(摄氏度) 下标用 _(下划线) 上标用^ (尖号) 希腊字母等特殊字符用 α \alpha β \beta γ \gamma θ \theta Θ \Theta Г \Ga ...
- 【TypeScript】TypeScript 学习 2——接口
在 TypeScript 中,接口是用作约束作用的,在编译成 JavaScript 的时候,所有的接口都会被擦除掉,因为 JavaScript 中并没有接口这一概念. 先看看一个简单的例子: func ...
- hsweb 企业后台管理基础框架
hsweb 详细介绍 业务功能 现在: 权限管理: 权限资源-角色-用户. 配置管理: kv结构,自定义配置.可通过此功能配置数据字典. 脚本管理: 动态脚本,支持javascript,groovy, ...
- Java Spring 后端项目搭建
参考了几位同行的Blogs和StackOverflow上的许多问答,搭建了此后端项目,替换原来的node.js后端,和前一篇中搭建的Vue Web App项目配合使用,后端准备只提供服务,不包含后端装 ...
- SVG系列教程:SVG简介与嵌入HTML页面的方式
地址:http://www.w3cplus.com/html5/svg-introduction-and-embedded-html-page.html 随着技术向前的推进,SVG相关的讨论也越渐频繁 ...
- ipad协议7.0,与大佬们分享几套新老版本的协议源码及算法,交流心得。
- SQL 2012新分页方式
--2012的OFFSET分页方式 (推荐使用 - 较为方便) select number from spt_values where type='p' order by number offset ...