Go 并发编程的思考( 三 )


Go 并发编程的思考

文章插图
 
上面我们提到,一个线程上在一个时刻执行运行一个协程,协程与协程之前是 Go 运行时来进行协同调度的 。另一个协程不会被 “被占用的线程” 调度,知道在该线程上运行着的协程被阻塞 。以下情况可以阻塞一个协程:
- 网络流输入
- 休眠 (sleeping)
- 通道 (channel) 操作
- 阻塞同步包 (
https://golang.org/pkg/sync/) 中的一些原语触发
我们可以思考,假设协程不在上述情况下阻塞,那么阻塞住的协程将导致它所运行在的线程阻塞,杀掉其他需要调度的协程,我们需要通过详细谨慎的编程手段来阻止这样的事情发生 。通道和同步原语在 Go 语言并发编程中扮演的举足轻重的角色,后面我们将通过详细的文章来分析它们的原理以及使用上的注意事项,这里不再过多阐述 。
通过这篇文章,我们了解了线程调度的概念,以及 Go 中的并发使用和协程调度模型,最后我们对线程和协程进行了详细的对比项,希望这些对比项可以帮助你在 Go 并发编程时做出更好的决策来使得程序达到更优的性能 。后续的文章,我们将给出一些实际的程序代码来探索 Go 并发编程的奥秘,尽情期待 。

【Go 并发编程的思考】


推荐阅读