豆豆Pool

Golang 协程工作池
授权协议 GPL
开发语言 Google Go
所属分类 程序开发、 其他开发相关
软件类型 开源软件
地区 国产
投 递 者 姬阳曜
操作系统 跨平台
开源组织
适用人群 未知
 软件概览

豆豆Pool — GOLANG简单的工作池

本repo是一个简单的golang工作池,仅供交流和学习使用。golang工作池的作用是可以限制goroutine的启动数量。

use

    //NewTask是放到工作池当中运行的函数。使用的时候需要先实例化他
	w := pool.NewTask(func() error { fmt.Println(time.Now());return nil })
	//实例化工作池
	p := pool.NewPool(3)
	//这里启用另外一个goroutine向worker当中写入,不然会出现all goroutines are asleep,需要从管道中获得一个数据,而这个数据必须是其他goroutine线放入管道的
	go func() {
		for {
			p.Worker <- w //把需要运行的函数依次放入工作池。
		}
	}()
	p.Run()

讨论

为什么需要工作池?

一般情况下,goroutine在操作系统上只要你的硬件资源够它是可以无限启动的。但是如果出现大规模的启动goroutine的情况会造成大量占用系统资源,我们知道普通的部署一个golang应用的时候操作系统不仅仅会运行golang程序还有其他辅助的程序运行,所以理论上讲工作池的目的就是为了限制golang的启动数量,保证不会出现硬件计算资源溢出的情况。

实际我们真的需要工作池吗?

理论上来讲,我们其实不需要在golang层面设置工作池的。如果是网络请求大部分时候我们会使用nginx或者其他网关,中间件作为golang程序的代理,我们可以在请求访问流量进入到golang程序之前使用nginx或者其他中间件限制流量或者使用熔断机制来保证我们的golang程序不会开满goroutine造成硬件计算资源溢出的情况。 如果流量小完全没必要限制goroutine 如果流量大没有熔断机制对整个服务都是很危险的。

工作池性能的讨论

我在编写自己的工作池之前使用了很多其他的工作池,我发现工作池本身并不会提升执行效率,反而会拖慢效率,使用工作池程序执行时间大概是原来的2/3,但是有一些pool会在一定程度上节省内存,比如ants,但内存的节省我觉得更多的是在于数据结构的复用,没有大量的重复创建数据对象导致的内存节省。

goroutine是否需要像其他编程语言一样使用I/O多路复用?

根据我在网上可以搜索到的资料,以及我自己的理解,golang本身是有一个pool用来复用goroutine的,所以我们并不需要自己再去实现一个多路复用的功能,反而会拖慢程序。

其他

以上论调并没有严谨的验证过,只是个人遇到的情况分享,希望和大家共同讨论学习,共同进步。

  • 对于一些对象,为了优化性能,节省每次使用都创建新对象所带来的内存开销,可以使用池化技术,预先创建好一些对象放入池中,使用时从池中获取,使用完再放回池中。这样就减少了对象创建所带来的开销。 在go中,原生的池化数据结构为sync.Pool, 有三个方法: New字段为一个方法,定义为func() interface{}, 在新建Pool时,定义好New字段,以供后续从池中获取对象时,如果当前池中无对

  • 这一系列主要说的是org.apache.commons.pool2包提供的ObjectPool以及对应的实现源码。 1.已有连接池举例 目前已知的对象池的应用,比如: 数据库连接池——org.apache.commons.dbcp2的BasicDataSource jedis连接池——redis.clients.jedis的JedisPool。 2.线程池 线程池的用法和这个不太一样,因为线程的r

  • 题目大意:在二维平面上有若干个点,求出两条不相交的二维LIS,使得上面包含的点的数目最多。 思路1:暴力建图 注意到不相交这个条件根本没用,画图可以发现如果相交的话,我们总可以通过交换一些点使得两个序列不相交。 那么问题转化为求出两个没有公共点的上升子序列,使得长度之和最大。 对于这种情况我们利用最大费用流求解。 设(a,b)分别表示一条有向边的流量和费用。 S->S' (2,0) S'->x(1

  •    Boost库的pool提供了一个内存池分配器,用于管理在一个独立的、大的分配空间里的动态内存分配。Boost库的pool主要适用于快速分配同样大小的内存块,尤其是反复分配和释放同样大小的内存块的情况。使用pool内存池主要有以下两个优点:   1. 能够有效地管理许多小型对象的分配和释放工作,避免了自己去管理内存而产生的内存碎片和效率低下问题。   2.  告别程序内存泄漏的烦恼,pool库

  • 本文参考http://blog.csdn.net/xushiweizh/archive/2006/11/21/1400426.aspx 并查阅了boost 的一些官方文档。   boost::pool 适用微小对象,这些对象被分配至堆上。它们应该没构造函数,析构函数。 可以看成一个种小型自定义数据类型。 boost::object_pool 适用于细粒度的对象,可以拥有无参数的构造函数和析构函数。

  • 工作中需要减少对一些比较耗系统资源对象的创建和初始化工作,因此想到了apache commons-pool工具包。commons-pool包里主要包括三个重要的接口: ObjectPool用于管理要被池化的对象的借出和归还; ObjectPoolFactory用于大量生成相同类型和设置的ObjectPool。 看看下面的例子 一个Connection类,可以想象成一个远程连接比如数据库连接等。其中

  • 本文整理汇总了Python中multiprocessing.pool.Pool方法的典型用法代码示例。如果您正苦于以下问题:Python pool.Pool方法的具体用法?Python pool.Pool怎么用?Python pool.Pool使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在模块multiprocessing.pool的用法示例。

  • OO随笔(关于connection pool系列的补充,兼答bonmot) 说起OO, 每个人都有每个人自己的见解。粗浅者如“obj.method的语法就是OO”;高深的则必侃“design pattern”. 今天我也来说说我的一孔之见。 什么是OO? 就是面向接口编程。无论你是用vtable, 或gp的function object, 或就是C的函数指针,正交分解也好,各种pattern也罢,

  • 70分的想法很好弄,直接按坐标关系建图,可是边会有n*n条,所以必超时。 满分算法是把每个点先按x排序,然后按类似于凸包的做法从每个点取最优值。 贪心可以证明,假如两个点x所标相同y坐标小的能到达的个数不少于y坐标大的个数;y坐标相同x同理。 所以两个路径应该都是按接近凸包上的点来走,所以路径流量为2,这样就缩小了走的范围。 #include <cstdio> #include <cstring>

  • buffer pool终于略知一二了 mysql一文之buffer pool 最近看到一个有意思的东西,就是关于mysql的数据是怎么被高效读取的。 innodb的缓冲池是什么,为什么要去使用它? mysql为什么会引入buffer pool这个机制呢?因为读取数据的时候,如果每次都去访问磁盘并把数据加载到内存,这样都会经过磁盘io。io操作会很费时间的,效率会很低,所以加入它查询时候会走缓存,效

  • 很标准的费用流,但是在建图时需要优化一下。否则spfa跑这种稠密图会T到飞。 贪心的想,如果x可以先到z再到y,则不建边(x,y)。 然后因为经过一个点只有1的贡献,所以要拆点,建图就是S->s,1,0 t->T,1,0 对于每一个点x,建边s->x,1,0 x’->t,1,0 x->x’,1,1 x->x’,1,0.对于每一条边(x,y),建边x’->y,2,0. #include <cstdi

  • 为什么会有对象池 在实际的应用工程当中,存在一些被频繁使用的、创建或者销毁比较耗时、持有的资源也比较昂贵的一些对象。比如:数据库连接对象、线程对象。所以如果能够通过一种方式,把这类对象统一管理,让这类对象可以被循环利用的话,就可以减少很多系统开销(内存、CPU、IO等),极大的提升应用性能。 Apache Commons Pool Apache Commons Pool就是一个对象池的框架,他提供

  • 本文参考 《MySQL是怎样运行的-从根上理解MySQL》 什么是Buffer Pool Buffer Pool是MySQL服务器启动时向操作系统申请的连续的内存空间,默认情况下,Buffer Pool只有128M;在启动时可以在配置文件中通过 innodb_buffer_size 参数设置Buffer Pool的大小,单位为字节 Buffer Pool的组成 基本元素:控制块和缓冲页 首先Buf

  • #!/usr/bin/python # -*-coding:utf-8-*- """ @file : demo.py @time: 2017/11/15 15:58 """ from multiprocessing import Process import requests import redis import time try: from aiohttp.errors import

  • """ 探索pool.map多进程执行方式的实质 """ from multiprocessing import Pool from time import sleep from datetime import datetime class forMap: def __init__(self): self.name = '没啥用的初始化' def forPri

  • 题目 二维矩阵(nm) 求每个(lw)的子矩阵的最大元素, 就是一维滑动窗口的升级版 自己瞎掰的题解 #include <bits/stdc++.h> using namespace std; const int N = 1e3; int n, m; // l 代表长 w 代表宽 int l, w; int s[N][N]; int dp[N][N]; // 相当于每行的我用单调队列做一遍

  •     还有一种常用的操作是k-max-pooling.这种是在max-pooling上改进来的,因为max-pooling操作太简单粗暴了,k-max-pooling认为每一块不只一个点重要,前几个亮点都比较重要,所以在每一个pooling块中取了前k大的值。   import torch def kmax_pooling(x, dim, k): index = x.topk(k, di

 相关资料
  • 豆坟 用来备份豆瓣帐号的软件,将你的豆瓣帐号数据备份到本地并支持脱机浏览。目前支持备份关注、黑名单、书影音、广播。 开发环境要求: VSCode Python 3.6 virtualenv 15.2 Nodejs 8.9 npm 5.8 git 2.16 开始 > npm config set script-shell "C:\\Program Files\\Git\\usr\\bin\\bash

  • 我试图在tomcat 9上部署我的应用程序,但在部署过程中,我面临以下异常 依赖关系.gradle 如下所示 注意:相同的应用程序正在weblogic 12上成功运行。

  • 我在EJB模块中有一个@Stateless bean 我在同一个EJB模块中有一个@Named bean Bar#hello是从Web模块中的CDI bean调用的。 由于某些原因,Bar并没有被注入到Foo中——它总是一个空引用。我希望这会奏效。

  • 魔豆固件下载(内部版inter、 开发版main 和稳定版stable) rom版本 M101C硬件 M101A硬件 开发版 1.8.05 main_m101c_all_1.8.05.bin main_m101a_all_1.8.05.bin 开发版 1.8.04 main_m101c_all_1.8.04.bin main_m101a_all_1.8.04.bin 稳定版 1.8.01 stab

  • 豆搭搭组件库。谐音"都搭搭",大家都来搭一搭,每个人都可以像搭积木一样搭建自己的项目。 版本说明 分支dev-1.x:基于springboot版本2.6.11,发布版本号1.x.x 分支dev:基于springboot版本2.7.3,发布版本号2.x.x 主要特性 基于成熟组件或算法封装 简单注解配置,即可实现相关组件操作 省掉碍眼繁琐的签名与验签,避免易出错点 丰富易用的API方法,满足个性化使