go 并发编程(2)
2024-10-12 04:48:47
协程
执行体是个抽象的概念,在操作系统层面有很多个概念与之对应,如操作系统自己掌管的进程(process),进程内的线程(thread),以及进程内的协程(coroutine,也叫轻量级线程).与传统的线程和进程比,协程的最大优势在于其"轻量级",可以轻松创建上百万而不导致系统资源耗尽,而线程和进程通常最多不能超过一万个,这也是协程叫轻量级线程的原因.
Go语言在语言级别支持轻量级线程,叫goroutine,Go语言标准库提供的所有系统调用操作,都会出让CPU给其他goroutine,这让轻量级线程的切换不依赖于系统的线程和进程,也不依赖于CPU的核心数量.
go语言执行机制:
go程序从初始化main package并执行main()函数开始,当main()函数返回时,程序退出,且程序并不等待其他goroutine(非主goroutine)结束.
要让主函数等待所有的goroutine退出后再返回,如何知道所有的goroutine都退出了呢?这就引出了多个goroutine之间通信的问题.
并发通信:
常见两种并发通信模型:
共享数据是指多个并发单元分别保持对同一个数据的引用,实现对该数据的共享.被共享的数据可能有多种形式,比如内存数据块,磁盘文件,网络数据等.常用内存共享.
消息机制认为每个并发单元是自包含的,独立的个体,并且都有自己的变量,但在不同并发单元间这些变量不同享.每个并发单元的输入和输出只有一种,那就是消息.有点类似进程的概念,每个进程不会被其他进程打扰,它只做好自己的工作就可以了,不同进程间靠消息来通信,他们不会共享内存.
go 语言提供的消息通信机制被称为channel.
最新文章
- Javascript学习笔记:闭包题解(3)
- 【131031】rel 属性 -- link标签中的rel属性,定义了文档与链接的关系
- SVG操作插件:SVG.JS 个人提取部分实用中文文档
- shell脚本编程-循环(for、while、until)
- asp.net页面间传值的几种方法
- SQL 存储过程中in
- 使用Visual Studio创建简单的自己定义Web Part 部件属性
- 【不积跬步,无以致千里】关闭631端口cups打印服务和8009端口ajp
- .htaccess 设置
- Winet API 支持HTTPP/SOCKS代理
- [LeetCode] 033. Search in Rotated Sorted Array (Hard) (C++)
- Java导出防止小数显示不全工具类
- Autofs自动挂载探讨
- 【nginx】nginx的工作模式和信号量控制
- Git使用手册【转】
- background-color:transparent
- SpringMVC(五)-- springmvc的系统学习之拦截器
- 右键添加git bush here
- JWT token心得
- 【剑指offer】11--旋转数组的最小数字(二分查找)