go语言信号量的使用例子
//shared values are passed around on channels // 信号量.
/* var sem = make(chan int, MaxOutstanding) func handle(r *Request) {
sem <- 1 // Wait for active queue to drain.
process(r) // May take a long time.
<-sem // Done; enable next request to run.
} func Serve(queue chan *Request) {
for {
req := <-queue
go handle(req) // Don't wait for handle to finish.
}
} 一堆请求requests进入serve中,不停的给req.进行handle操作
每运行一个之前,都用这个公共的变量req来进行维护.信号量满了就展厅handle新的,
每一个handle玩就会让信号量+1,可以让新的东西进来继续跑. 这个代码有bug,因为堵塞是在handle里面发生的,所以同时有无穷个请求打过来
的时候,还是会开启所有的线程,cpu会被无限吃光. 所以就需要下面的让堵塞发生给for循环上.直接在serve层面堵塞.这样cpu就只能开
MaxOutstanding这么多的线程了. func Serve(queue chan *Request) {
for req := range queue {
sem <- 1 //因为信号量放这里,堵塞for循环,会让cpu保证不会无穷耗尽!
go func() {
process(req) // Buggy; see explanation below.
<-sem
}()
}
} //下面处理for循环层面的变量问题,for循环里面的变量是共享内存的.
也就是
上面的代码for循环中第一次循环体和第二次循环体内容同时跑的时候,他们
操作的是同一个req.这不是我们要的.所以在下面代码中
go func(req *Request) 进行一次值拷贝,这样就保证每一次for循环中操作的变量
都唯一了. func Serve(queue chan *Request) {
for req := range queue {
sem <- 1
go func(req *Request) {
process(req)
<-sem
}(req)
}
} //当然下面这个req:=req 是go语言推荐的写法,确实更加简练.
//当然也是一次值拷贝. func Serve(queue chan *Request) {
for req := range queue {
req := req // Create new instance of req for the goroutine.
sem <- 1
go func() {
process(req)
<-sem
}()
}
} */
go语言信号量的使用例子的更多相关文章
- Windows下C语言的Socket编程例子(TCP和UDP)
原文:Windows下C语言的Socket编程例子(TCP和UDP) 刚刚学windows编程,所以想写学习笔记,这是一个简单的Socket程序例子,开发环境是vc6: 首先是TCP server端: ...
- python 全栈开发,Day119(Flask初识,Render Redirect HttpResponse,request,模板语言 Jinja2,用户登录例子,内置Session)
一.Flask初识 首先,要看你学没学过Django 如果学过Django 的同学,请从头看到尾,如果没有学过Django的同学,并且不想学习Django的同学,轻饶过第一部分 三大主流Web框架对比 ...
- go语言学习之从例子开始
[目录] go语言从例子开始之Example1.helloworld go语言从例子开始之Example2.类型 go语言从例子开始之Example3.变量 go语言从例子开始之Example4.常量 ...
- Libra教程之:move语言的特点和例子
文章目录 move语言的特点 资源优先 灵活性 安全性 可验证性 Move语句初探 点对点支付交易脚本 Currency Module move语言的特点 Libra的目标是打造一个全球话的金融和货币 ...
- linux下的C语言开发 GDB的例子
在很多人的眼里,C语言和linux常常是分不开的.这其中的原因很多,其中最重要的一部分我认为是linux本身就是C语言的杰出作品.当然,linux操作系统本身对C语言的支持也是相当到位的.作为一个真正 ...
- go语言 strconv.ParseInt 的例子
golang strconv.ParseInt 是将字符串转换为数字的函数,功能灰常之强大,看的我口水直流. func ParseInt(s string, base int, bitSize int ...
- C语言指针的使用例子(1)指针地址的输出
#include <stdio.h> int main(void) { int a=10; int *p = &a; *p = 89; printf("变量值a=%d a ...
- C语言并查集例子——图问题巧用parent[]数组
输入:测试输入包含若干测试用例.每个测试用例的第1行给出两个正整数,分别是城镇数目N ( < 1000 )和道路数目M:随后的M行对应M条道路,每行给出一对正整数,分别是该条道路直接连通的两个城 ...
- 【C语言】指针函数例子
#include<stdio.h> char* getword(char); char* getword(char c) { switch (c) { case'A':return&quo ...
随机推荐
- Vue 拖拽组件 vuedraggable 、 vue-dragging 、awe-dnd
参考链接:http://www.ptbird.cn/vue-draggable-dragging.html vue-draggable 学习和使用:https://www.jianshu.com/p/ ...
- selenium + python 环境配置 (二)之启动IE
安装好python.selenium工具后,下一步就是启动浏览器 1.启动IE浏览器 即Selenium 调用IEDriverServer打开IE浏览器 ,因此需下载对应的IEDriverServer ...
- 安卓AES加密
一:什么是AES加密 AES高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准. ...
- electron node.js 实现文件拖动读取文件
css/styles.css .for_file_drop { width: 100%; height: 100px; background-color: blueviolet; } index.ht ...
- mac 已损坏 移至废纸篓
1.问题描述: 从网页下载的安装包,总是提示“已损坏,移至废纸篓”这类的信息 2.原因: 系统版本过高,对安全性进行了校验. 3.解决方案:命令行输入以下命令,然后输入密码 sudo spctl -- ...
- Oracle日常
Xmltype select extractvalue(value(x), '//utext') value from table(XMLSEQUENCE(extract(v_xmlContent, ...
- wordpress 后台无法登录 网站内容缺失
昨天网站又突然不正常了,前两天都是好的.. 具体来说就是wp后台登录不进去,一直在登录页跳转,与此同时服务器上其他网站也有这个问题,而且有些网站的板块内容也缺失了, 所以首要就是要登录进后台看看是不是 ...
- Image splicing forgery detection combining coarse to refined convolutional neural network and adaptive clustering
粗到精的卷积神经网络与自适应聚类相结合的图像拼接篡改检测 研究方向:图像篡改检测 论文出处:ELSEVIER A类 学校:西安电子科技大学网络工程学院.重庆邮电大学计算机科学与技术学院 关键字:Spl ...
- 通过命令行新建qt项目,并编译打包
ref: https://blog.csdn.net/weixin_42837024/article/details/81945656 平台 :Ubuntu 18.04 QT版本 :5.9.1 ( ...
- vue 集成 NEditor 富文本
下载NEditor 放在 vue 项目下面 public 文件中. 安装 vue-neditor-wrap 执行命令 npm install vue-neditor-wrap 代码使用 ...