[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学习笔记----并发
并发模型 并发目前来看比较主流的就三种: 多线程:每个线程一次处理一个请求,线程越多可并发处理的请求数就越多,但是在高并发下,多线程开销会比较大. 协程:无需抢占式的调度,开销小,可以有效的提高线程的 ...
随机推荐
- 设置UINavigationController相同标题
设置UINavigationController相同标题,让UINavigationController内的每一个ViewController的标题都一样,可以使用以下设置. UINavigation ...
- css3 钟表
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- NativeInt
NativeInt ni = 100; //Wrong. Will issue an Error NativeInt ni = NativeInt(100); //Correct System::Ge ...
- C++11 语法记录
转自:http://blog.csdn.net/crayondeng/article/details/18563121 一.Lambda表达式 C++ 11中的Lambda表达式用于定义并创建匿名的函 ...
- python's descriptor II
[python's descriptor II] For instance, a.x has a lookup chain starting with a.__dict__['x'], then ty ...
- 配置超级用户口令(Cisco IOS系统)
命令一共有以下几条: (1)enable secret enable secret 0 密码明文 enable secret 5 密码密文(MD5加密) (2)enable password enab ...
- LoadRunner执行自动化以及报告自动化的方法
There are three major articles KB articles on Automating LR: 1. Command line arguments for the LoadR ...
- class bool
class bool(int): """ bool(x) -> bool Returns True when the argument x is true, Fal ...
- hdoj 5386 Cover
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5386 倒着推的一个挺暴力的题,看着和数学有关系,然而并没有, 不要一看到含有数学元素就考虑这是一个数学 ...
- 解决sqlserver使用IP无法连接的问题,用localhost或者‘“.”可以连接
今天装了一个mssql发现用ip无法连接但是用localhost和“.”却可以连接,纠结了一天终于找到了问题的解决办法: 打开mssql配置管理器(我点电脑---->右键选择管理--->服 ...