文章插图
上面我们提到,一个线程上在一个时刻执行运行一个协程,协程与协程之前是 Go 运行时来进行协同调度的 。另一个协程不会被 “被占用的线程” 调度,知道在该线程上运行着的协程被阻塞 。以下情况可以阻塞一个协程:
- 网络流输入
- 休眠 (sleeping)
- 通道 (channel) 操作
- 阻塞同步包 (
https://golang.org/pkg/sync/) 中的一些原语触发
我们可以思考,假设协程不在上述情况下阻塞,那么阻塞住的协程将导致它所运行在的线程阻塞,杀掉其他需要调度的协程,我们需要通过详细谨慎的编程手段来阻止这样的事情发生 。通道和同步原语在 Go 语言并发编程中扮演的举足轻重的角色,后面我们将通过详细的文章来分析它们的原理以及使用上的注意事项,这里不再过多阐述 。
通过这篇文章,我们了解了线程调度的概念,以及 Go 中的并发使用和协程调度模型,最后我们对线程和协程进行了详细的对比项,希望这些对比项可以帮助你在 Go 并发编程时做出更好的决策来使得程序达到更优的性能 。后续的文章,我们将给出一些实际的程序代码来探索 Go 并发编程的奥秘,尽情期待 。
【Go 并发编程的思考】
推荐阅读
- 冬季养生的几款茶,几款适合在冬季的养生茶配方
- 茶最好适度保持健康,茶的好处介绍之
- 一个软件测试员开发的IT在线工具网已上线,欢迎体验
- 用 Python 绘制数据的7种最流行的方法
- WebSSH - 网页上的SSH终端
- 开源一款超实用的 Dubbo 测试工具,已用半年,感觉很有feel
- CentOS VS Ubuntu,谁才是更好的 Linux 版本?
- 如何监视Python程序的内存使用情况
- 某网站JS的变态写法
- 通过一个算法来简化你的 css