限制goroutine数量写法
虽然golang的goroutine可以开启无数个goroutine,但是没有限制也是不行的。我就写一下我对goroutine数量限制的写法
1、初始化goroutine协程池。把goroutine数量开启完毕
2、在池子中调用goroutine
package main import (
"fmt"
"runtime"
"time"
) /*
主要逻辑
1、初始化一个工作池,并且定义要启动多少个goroutine的数量的channel
2、在这个池子里面,把数据加入到channel 这里用for循环
3、在具体的函数中的defer中把channel里面的数据去除掉
*/ var (
ch=make(chan bool,)
c=
) //初始化工作池
func init(){
for i:=;i<c;i++{
go Queu()
}
} func main(){
fmt.Print("main") //获取一行的输入
var input string
fmt.Scanln(&input)
} //在工作池中限制goroutine的数量
func Queu(){
t:=time.NewTicker(time.Second)
defer func(){
t.Stop()
}() for{
select{
case ch<-true:
go test1()
case <-t.C:
test()
}
} } func test1(){
defer func(){
<-ch
}()
time.Sleep(time.Millisecond * )
} func test(){
fmt.Printf("%d====numGo\n", runtime.NumGoroutine())
}
我的理解:限制goroutine的数量:
就是通过channel的异步阻塞的特性来完成
上面的代码还不健壮,加上waitgroup以及锁,可以在不同的场景下适用
限制goroutine数量写法的更多相关文章
- go中控制goroutine数量
控制goroutine数量 前言 控制goroutine的数量 通过channel+sync 使用semaphore 线程池 几个开源的线程池的设计 fasthttp中的协程池实现 Start Sto ...
- Go 笔记之如何防止 goroutine 泄露
今天来简单谈谈,Go 如何防止 goroutine 泄露. 概述 Go 的并发模型与其他语言不同,虽说它简化了并发程序的开发难度,但如果不了解使用方法,常常会遇到 goroutine 泄露的问题.虽然 ...
- Golang 探索对Goroutine的控制方法
前言 在golang中,只需要在函数调用前加上关键字go即可创建一个并发任务单元,而这个新建的任务会被放入队列中,等待调度器安排.相比系统的MB级别线程栈,goroutine的自定义栈只有2KB,这使 ...
- Golang学习笔记:goroutine
1.goroutine goroutine是go语言的并发体.在go语言里面能使用go关键字来实现并发. go func() 1.1 概念介绍 goroutine本质上是协程,我刚刚学习的时候就粗略地 ...
- 使goroutine同步的方法总结
前言: 在前面并发性能对比的文章中,我们可以看到Golang处理大并发的能力十分强劲,而且开发也特别方便,只需要用go关键字即可开启一个新的协程. 但当多个goroutine同时进行处理的时候,就会遇 ...
- gf框架之grpool - 高性能的goroutine池
Go语言中的goroutine虽然相对于系统线程来说比较轻量级,但是在高并发量下的goroutine频繁创建和销毁对于性能损耗以及GC来说压力也不小.充分将goroutine复用,减少goroutin ...
- Goroutine并发调度模型深度解析之手撸一个协程池
golanggoroutine协程池Groutine Pool高并发 并发(并行),一直以来都是一个编程语言里的核心主题之一,也是被开发者关注最多的话题:Go语言作为一个出道以来就自带 『高并发』光环 ...
- 第三章 Goroutine调度策略(16)
本文是<Go语言调度器源代码情景分析>系列的第16篇,也是第三章<Goroutine调度策略>的第1小节. 在调度器概述一节我们提到过,所谓的goroutine调度,是指程序代 ...
- Go语言调度器之盗取goroutine(17)
本文是<Go语言调度器源代码情景分析>系列的第17篇,也是第三章<Goroutine调度策略>的第2小节. 上一小节我们分析了从全局运行队列与工作线程的本地运行队列获取goro ...
随机推荐
- mongodb在32位机的连接
Windows 32bit版本安装Mongodb时,会发生的下面问题 2016-05-09T00:09:45.124+0800 I STORAGE [initandlisten] exception ...
- [LintCode] 带重复元素的排列
递归实现: class Solution { public: /** * @param nums: A list of integers. * @return: A list of unique pe ...
- iOS平台iPhone和iPad免费开放源代码游戏案例列表
此页面列表收集的是一些iPhone和iPad等iOS操作系统的开放源代码(Open Source)游戏.这些iOS开源游戏都是曾经或正发布在App Store.列表中的这些iOS开源游戏都是使用主流的 ...
- Linux ssh其他服务器
- 从global到mooncake迁移SQL Azure
之前遇到了问题,在此备注一下: 因为两个环境基本上可以认为是隔离的,所以迁移过程基本上只有通过导出.导入的方式(也是官方推荐的方式): 1.从global上进行数据库的export操作(扩展名bacp ...
- 用express创建网站出现"$ DEBUG=microbog ./bin/www"的提示
第一次用express框架创建网站,指令为:“express -t ejs microblog”,如下图 指令运行完成后,出现如图框中的提示,不知道什么意思,运行:“node app.js”来启动服务 ...
- Eclipse MyBatis Generator插件安装
目录 Eclipse MyBatis Generator插件安装 Eclipse MyBatis Generator插件安装 1.进入Eclipse Marketplace [Help] -> ...
- ClickHouse RPM packages installation from packagecloud.io
Table of Contents Introduction Script-based installation Install script Install packages after scrip ...
- SET NAMES 'charset_name'
设置写入db和db返回读出结果的字符集character set https://dev.mysql.com/doc/refman/5.7/en/charset-connection.html SET ...
- <2014 04 26> 《Coders at Work编程人生:15位软件先驱访谈录》
什么是老派程序员?调试只用printf,关心数据结构,先整体或先局部,不知道OO.IDE.TDD.BDD等等为何物.Ken Thompson,Jamie Zawinski,Joe Armstrong, ...