[golang学习] goroutine调度
这两天有些闲功夫, 学习下golang, 确实非常简洁.
不过有些缺憾. 在我的测试中. golang的调度(goroutine)似乎不是非常好.
func say(k int) { fmt.Println(k)
} func main() {
runtime.GOMAXPROCS() for i := ; i < ; i++ {
go say(i)
} for { }
}
这段测试代码是有bug的.
一开始我并没有设置
runtime.GOMAXPROCS(2)
则由于for循环导致主线程阻塞. 所有的goroutine都没有机会执行.
我在询问了某个人之后, 加上这句.
这是设置go的os线程数.
但这样出来的结果就有点奇怪, 有时候会输出100个k, 有时候会输出50个k. 或者干脆一个k都没有.
为什么呢?
因为我们无法控制goroutine会被分配在哪个 os线程上.
所以唯一(我所能查阅到的资料) 的解决办法是在for循环中主动交出控制权. 使同一个 os线程上的goroutine有机会被执行.
像下面这样:
for {
runtime.GOMAXPROCS(2)
}
这里有一篇详细的关于go 调度器的解释:
http://morsmachine.dk/go-scheduler
也就是golang 中的每个os线程对应的goroutine队列, 在某个线程阻塞时会发生切换. 切换到其他其他线程执行. 但这个往往发生在I/O和系统调用时.
那为什么纯粹的for循环阻塞时 golang无法把goroutine切换到其他线程执行呢?
因为go自己实现的I/O和系统调用 内部会自动调用runtime.GOMAXPROCS(2)
以上没有源码分析作为支持. 可能会有谬误. 请告诉我.
golang在后续版本中应该会持续改进调度器.
[golang学习] goroutine调度的更多相关文章
- [转]golang的goroutine调度机制
golang的goroutine调度机制 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] 一直对goroutine的调度机制很好奇最近在看雨痕的golang源码分析基于go ...
- Golang/Go goroutine调度器原理/实现【原】
Go语言在2016年再次拿下TIBOE年度编程语言称号,这充分证明了Go语言这几年在全世界范围内的受欢迎程度.如果要对世界范围内的gopher发起一次“你究竟喜欢Go的哪一点”的调查,我相信很多Gop ...
- go语言之行--golang核武器goroutine调度原理、channel详解
一.goroutine简介 goroutine是go语言中最为NB的设计,也是其魅力所在,goroutine的本质是协程,是实现并行计算的核心.goroutine使用方式非常的简单,只需使用go关键字 ...
- golang GMP goroutine调度器
Goroutine可以动态的伸缩栈的大小,最小2-4kb,最大1GB
- 谈谈Golang中goroutine的调度问题
goroutine的调度问题,同样也是我之前面试的问题,不过这个问题我当时并不是很清楚,回来以后立马查阅资料,现整理出来备忘. 有一些预备知识需要说明,就是操作系统中的线程.操作系统中的线程分为两种: ...
- golang学习笔记6 beego项目路由设置
golang学习笔记5 beego项目路由设置 前面我们已经创建了 beego 项目,而且我们也看到它已经运行起来了,那么是如何运行起来的呢?让我们从入口文件先分析起来吧: package main ...
- go语言,golang学习笔记2 web框架选择
go语言,golang学习笔记2 web框架选择 用什么go web框架比较好呢?能不能推荐个中文资料多的web框架呢? beego框架用的人最多,中文资料最多 首页 - beego: 简约 & ...
- 弄懂goroutine调度原理
goroutine简介 golang语言作者Rob Pike说,"Goroutine是一个与其他goroutines 并发运行在同一地址空间的Go函数或方法.一个运行的程序由一个或更多个go ...
- golang学习笔记----并发
并发模型 并发目前来看比较主流的就三种: 多线程:每个线程一次处理一个请求,线程越多可并发处理的请求数就越多,但是在高并发下,多线程开销会比较大. 协程:无需抢占式的调度,开销小,可以有效的提高线程的 ...
随机推荐
- ajax 加载不同数据
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- dom 动态生产表格
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- 利用AuthorizeAttribute属性简单避免 MVC 中的跨域攻击
跨域攻击---自然来路页面和目标页面不在同一个域下,所以直接判断来路域和当前自己的域就可以了. 可以广泛应用于表单提交,ajax调用或者某些不想让用户直接输入网址看到的页面 [csharp] view ...
- 第二百二十六天 how can I 坚持
今天弟弟生日,只是简单的说了句生日快乐,幸亏看了下日历,要不又忘了. 在家待了一天. 明天还想去爬山,八大处太远了,该去哪呢. 不想在家待着. 日复一日,啊,年复一年啊.想想好可怕,人生,太快.该如何 ...
- redhat6.4升级openssh至6.7
1:简介 最近浙江电信对线上服务器进行漏洞扫描,暴露出原有的openssh有漏洞,建议升级openssh版本: 2:操作环境 Red Hat Enterprise Linux Server relea ...
- TcxDBVerticalGrid优秀的编辑控件
- CTE初识
微软从SQl2005起引入了CTE(Common Table Expression)以强化T-SQL.这是一个类似于非持久视图的好东西. 正常的SQL语句: select * from person. ...
- .NET文件上传的大小限制配置
<system.web> <!--maxRequestLength单位是Kb--> <httpRuntime maxRequestLength="20971 ...
- Spring JTA应用JOTM & Atomikos I Application
关于Spring JTA的介绍非常多了,这里就不再一再阐述其优越性怎么怎么了,直接开始正题.一个大致的需求如下,用户在进行增删改操作时,会同时更新2至3个数据库的数据表,操作需要事务来包裹,以便在操作 ...
- 如何让label和textblock分成两行
http://stackoverflow.com/questions/183406/xaml-newline-in-string-attribute http://www.developerfusio ...