|
|
51CTO旗下网站
|
|
移动端

10.2.1 协程基础

《Go语言编程入门与实战技巧》第10章并发编程,本章Go语言里的并发指的是能让某个函数独立于其他函数运行的能力。当一个函数创建为协程(goroutine)时,Go语言会将其视为一个独立的工作单元,这个单元会被调度到可用的逻辑处理器上执行。本节为大家介绍协程基础。

作者:黄靖钧来源:电子工业出版社|2018-09-23 09:45

10.2.1  协程基础

goroutine是Go语言并行设计的核心。goroutine说到底其实就是协程,但是它比线程更小,十几个goroutine可能体现在底层也就是五六个线程,Go语言内部帮你实现了这些goroutine之间的内存共享。执行goroutine只需极少的栈内存(大概是4KB~5KB),当然会根据相应的数据伸缩。也正因为如此,程序可同时运行成千上万个并发任务。goroutine比thread更易用、更高效、更轻便。

goroutine是通过Go程序的runtime管理的一个线程管理器。goroutine通过go关键字实现了,其实就是一个普通的函数:

  1. go hello(a, b, c) 

通过关键字go就启动了一个goroutine。下面来看一个例子:

  1. // 示例代码10-2  
  2. package main  
  3.  
  4. import (  
  5.     "fmt"  
  6.     "runtime"  
  7. )  
  8.  
  9. func say(s string) {  
  10.     for i :0; i < 5; i++ {  
  11.         runtime.Gosched()  
  12.         fmt.Println(s)  
  13.     }  
  14. }  
  15.  
  16. func main() {  
  17.     go say("world") // 开一个新的goroutine执行  
  18.     say("hello") // 当前goroutine执行  
  19. }  
  20. /*  
  21. 返回:  
  22. hello  
  23. world  
  24. hello  
  25. world  
  26. hello  
  27. world  
  28. hello  
  29. world  
  30. hello  
  31. */  

可以看到go关键字很方便地就实现了并发编程。上面的多个goroutine运行在同一个进程里面,共享内存数据,不过设计上要遵循:不要通过共享来通信,而要通过通信来共享。

runtime.Gosched()表示让CPU把时间片让给别人,下次某个时候继续恢复执行该goroutine。在默认情况下,在Go 1.5以后将标识并发系统线程个数的runtime.GOMAXPROCS的初始值由1改为了运行环境的CPU核数。

可以通过设置runtime.GOMAXPROCS(n)告诉调度器最大可以使用多少个线程,GOMAXPROCS设置了同时运行逻辑代码的系统线程的最大数量,并返回之前的设置。如果n < 1,不会改变当前设置。


喜欢的朋友可以添加我们的微信账号:

51CTO读书频道二维码


51CTO读书会第9群:808517103

【责任编辑:book TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

程序员面试宝典

本书取材于各大IT公司历年面试真题(笔试、口试、电话面试、英语面试,以及逻辑测试和智商测试)。详细分析了应聘程序员(含网络、测试等...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊