🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
> ### goroutine * 系统级的线程(系统自动创建和销毁), 用户级的协程(Go调度器管理) * M线程 P介质(协程运行在线程上) * 创建线程消耗几M内存, 协程几Kb * go 关键字用来创建 goroutine (协程),是实现并发(一个咖啡机, 两个队伍)的关键 * 抢占不了死循环,死循环没有调度点 ![](/D:/%E6%AD%A3%E5%BC%8F%E6%A1%8C%E9%9D%A2/Golang%E5%B7%A5%E4%BD%9C%E7%AC%94%E8%AE%B0/book/Golang%E5%B7%A5%E4%BD%9C%E7%AC%94%E8%AE%B0/images/in-motion.jpg) * go关键字只是创建协程并加入调度队列,协程并没有立刻调度(由于这个原因,调度的时机和顺序是未知的) ~~~ package main import ( "fmt" "sync" "time" ) func main() { var wg sync.WaitGroup wg.Add(2) go func() { time.Sleep(2 * time.Second) fmt.Println("1号完成") wg.Done() }() go func() { time.Sleep(2 * time.Second) fmt.Println("2号完成") wg.Done() }() wg.Wait() fmt.Println("好了,大家都干完了,放工") } ~~~ > ### 调度问题 ~~~ package main import ( "fmt" "time" "runtime" ) func main() { runtime.GOMAXPROCS(1) for i := 0; i < 10; i++ { go func(i int) { fmt.Printf("%c\n", 'a'+i) runtime.Gosched() }(i) go func(i int) { fmt.Printf("%c\n", 'A'+i) }(i) } time.Sleep(time.Second) } ~~~ > ### 并发和并行 * 两个队列,一个Coffee机器,那是并发 * 两个队列,两个Coffee机器,那是并行 ![](/D:/%E6%AD%A3%E5%BC%8F%E6%A1%8C%E9%9D%A2/Golang%E5%B7%A5%E4%BD%9C%E7%AC%94%E8%AE%B0/book/Golang%E5%B7%A5%E4%BD%9C%E7%AC%94%E8%AE%B0/images/252154376071443.jpg) > ### 相关阅读 * [Go Channel 应用模式](http://colobu.com/2018/03/26/channel-patterns/) * [golang 的channels 行为](https://segmentfault.com/a/1190000014524388) * [Go语言并发与并行学习笔记(一)](http://blog.csdn.net/kjfcpua/article/details/18265441) * [Go语言并发与并行学习笔记(二)](http://blog.csdn.net/kjfcpua/article/details/18265461) * [Go语言并发与并行学习笔记(三)](http://blog.csdn.net/kjfcpua/article/details/18265475) * [Go 语言 select 语句](http://www.runoob.com/go/go-select-statement.html) * [Go并发编程—select的使用](https://blog.csdn.net/zg_hover/article/details/81453379)