goroutine和channel

近期在学习golang的goroutine和channel时候有一些疑惑:golang

  1. 带缓冲的channel和不带缓冲的channel有什么区别?
  2. goroutine和主进程的有哪些影响和关系?
  3. 多个goroutine的执行顺序是怎么样的?

经过下面的代码咱们能够获得答案并发

第一个例子

  1. 带缓冲的channel和不带缓冲的channel有什么区别?
    没有缓冲的channel必须等到有接收者才会执行后面的代码(阻塞)
  2. goroutine和主进程的有哪些影响和关系?
    主进程若是退出会致使全部的goroutine中断退出。
  3. 多个goroutine的执行顺序是怎么样的?
    多个goroutine会并发执行。

第二个例子

输出:函数

Washington Tripoli London Beijing tokyo

main() 函数中启动了两个协程:sendData() 经过通道 ch 发送了 5 个字符串,getData() 按顺序接收它们并打印出来。
若是 2 个协程须要通讯,你必须给他们同一个通道做为参数才行。学习

尝试一下若是注释掉 time.Sleep(1e9) 会如何。code

咱们发现协程之间的同步很是重要:

  • main() 等待了 1 秒让两个协程完成,若是不这样,sendData() 就没有机会输出。
  • getData() 使用了无限循环:它随着 sendData() 的发送完成和 ch 变空也结束了。
  • 若是咱们移除一个或全部 go 关键字,程序没法运行,Go 运行时会抛出 panic:
---- Error run E:/Go/Goboek/code examples/chapter 14/goroutine2.exe with code Crashed ---- Program exited with code -2147483645: panic: all goroutines are asleep-deadlock!

为何会这样?运行时会检查全部的协程(也许只有一个是这种状况)是否在等待(能够读取或者写入某个通道),意味着程序没法处理。这是死锁(deadlock)形式,运行时能够检测到这种状况。协程

注意:不要使用打印状态来代表通道的发送和接收顺序:因为打印状态和通道实际发生读写的时间延迟会致使和真实发生的顺序不一样。blog

相关文章
相关标签/搜索