Golang开发学习笔记
2013-08-13 12:02
369 查看
1. 其他语言关于接口的设计都是实现类服务于接口,而Golang似乎是方法为主接口为辅,可以先考虑实体再考虑接口。
2. select和switch是相似的,case之间是互斥的。所以超时可在一个一秒超时的timeout goroutine中设置一个sleep(1e9),参数单位是纳秒,然后用一个case <-timeout去捕捉超时,这样就会顺利跳出select,不再去等待其他的goroutine。
是否可以将总的计算时间降到接近原来的1/N呢?答案是不一定。如果掐秒表(正常点的话,应该用7.8节中介绍的Benchmark方法),会发现总的执行时间没有明显缩短。再去观察CPU运行状态,你会发现尽管我们有16个CPU核心,但在计算过程中其实只有一个CPU核心处于繁忙状态,
这是会让很多Go语言初学者迷惑的问题。
官方的答案是,这是当前版本的Go编译器还不能很智能地去发现和利用多核的优势。虽然我们确实创建了多个goroutine,并且从运行状态看这些goroutine也都在并行运行,但实际上所有这些goroutine都运行在同一个CPU核心上,在一个goroutine得到时间片执行的时候,其他goroutine都会处于等待状态。从这一点可以看出,虽然goroutine简化了我们写并行代码的过程,但实际上整体运行效率并不真正高于单线程程序。
在Go语言升级到默认支持多CPU的某个版本之前,我们可以先通过设置环境变量GOMAXPROCS的值来控制使用多少个CPU核心。具体操作方法是通过直接设置环境变量GOMAXPROCS的值,或者在代码中启动goroutine之前先调用以下这个语句以设置使用16个CPU核心:runtime.GOMAXPROCS(16)
到底应该设置多少个CPU核心呢,其实runtime包中还提供了另外一个函数NumCPU()来获取核心数。可以看到,Go语言其实已经感知到所有的环境信息,下一版本中完全可以利用这些信息将goroutine调度到所有CPU核心上,从而最大化地利用服务器的多核计算能力。抛弃GOMAXPROCS只是个时间问题。
2. select和switch是相似的,case之间是互斥的。所以超时可在一个一秒超时的timeout goroutine中设置一个sleep(1e9),参数单位是纳秒,然后用一个case <-timeout去捕捉超时,这样就会顺利跳出select,不再去等待其他的goroutine。
是否可以将总的计算时间降到接近原来的1/N呢?答案是不一定。如果掐秒表(正常点的话,应该用7.8节中介绍的Benchmark方法),会发现总的执行时间没有明显缩短。再去观察CPU运行状态,你会发现尽管我们有16个CPU核心,但在计算过程中其实只有一个CPU核心处于繁忙状态,
这是会让很多Go语言初学者迷惑的问题。
官方的答案是,这是当前版本的Go编译器还不能很智能地去发现和利用多核的优势。虽然我们确实创建了多个goroutine,并且从运行状态看这些goroutine也都在并行运行,但实际上所有这些goroutine都运行在同一个CPU核心上,在一个goroutine得到时间片执行的时候,其他goroutine都会处于等待状态。从这一点可以看出,虽然goroutine简化了我们写并行代码的过程,但实际上整体运行效率并不真正高于单线程程序。
在Go语言升级到默认支持多CPU的某个版本之前,我们可以先通过设置环境变量GOMAXPROCS的值来控制使用多少个CPU核心。具体操作方法是通过直接设置环境变量GOMAXPROCS的值,或者在代码中启动goroutine之前先调用以下这个语句以设置使用16个CPU核心:runtime.GOMAXPROCS(16)
到底应该设置多少个CPU核心呢,其实runtime包中还提供了另外一个函数NumCPU()来获取核心数。可以看到,Go语言其实已经感知到所有的环境信息,下一版本中完全可以利用这些信息将goroutine调度到所有CPU核心上,从而最大化地利用服务器的多核计算能力。抛弃GOMAXPROCS只是个时间问题。
相关文章推荐
- Android&nbsp;Map开发基础知识学习笔记
- 嵌入式开发学习笔记 ( java - c/c++ :从入门到入门 )
- Android开发学习笔记:浅谈GridView
- SpringMVC学习笔记(一)使用IntelliJ IDEA开发Spring MVC HelloWorld
- 【Android开发学习笔记】【第一课】初识New Project,工程文件介绍
- Lua学习笔记1:Windows7下使用VS2008搭建Lua开发环境(一)
- Android开发学习笔记-5 Activity-4 Activity生命周期
- DirectX 9.0c游戏开发手记之“龙书”第二版学习笔记之1: 开场白
- iPhone开发学习笔记
- Android开发学习笔记:浅谈WebView
- Cocos2d-x学习笔记(一)——开发环境搭建(win7)
- Ubuntu下ARM开发.ld链接文件的学习笔记
- Android开发艺术探索 学习笔记
- Unity开发基础——基本数据类型学习笔记
- 【Golang学习笔记】02
- snmp学习笔记之三--开发netsnmp Agent
- iOS开发学习笔记 -- (二)动态添加控件和事件处理
- 用S60操作系统SDK开发NOKIA手机应用程序-学习笔记(2)
- 蓝鸥Unity开发基础——运算符和表达式学习笔记
- ASP.NET控件开发学习笔记--第3回 自制导航控件