go 并发小览

并发小结:

区分并行和并发,概念里头并发包括并行

多进程编程:

进程间通信包括,基于通信 基于信号 和 基于同步的ipc方法

--基于通信ipc方法,包括基于数据传递和内存共享。

---数据传递主要通过管道pipe和消息队列queue来实现

基于同步的ipc方法中,是通过信号量来同步的

基于信号的是通过操作系统的信号机制,唯一的一种异步ipc方法

 

go语言,包括 管道 信号和socket(代码演示)

 

并发和循环:goroutine 放到for循环中,如果元素不是引用类型,会出现只循环最后一个值的情况,原因是gorotuine执行之前for循环已经执行完毕,通过把元素单个值赋给另一个元素,来实现并发机制。这里的原来是通过值拷贝来实现

 

管道:

分为匿名管道和命名管道,系统提供的管道是阻塞的,go提供了可用多路复用的内存管道  io.pipe

管道队列属于缓冲队列,接收方会复制发送的值,如果出现互相等待,如多个接收方等待,发送方会直接赋值给接收方,又或是已满通道的接收方,会把最早缓冲的元素复制给接收方,再把最早等待的发送方的值直接复制到这个位置上。

管道的收发与数据类型相关,引用的数据类型,修改接收方也会改变发送方数据,多用引用类型元素

管道关闭操作,只在发送方,只能关闭一次,否则会引发panic

双向管道可以转换成单向管道用,单向管道不可转成双向管道

管道多路复用select,如果多条case满足,采用伪随机任意选择一个,如果都不满足,且没有default,goroutine会被阻塞

非缓冲管道同步时会等待最慢的一方,且发送方和接收方每收发一个元素就需要握手,通过cap判断是否为缓冲管道

定时器,可以复用,不必循环创建,如果到期前停止了它,那么管道无法缓冲数据,且无法接收到传值,如果接收,会造成goroutine阻塞。如果未能及时接收数据,那么该数据会一直阻塞,会面数据会被丢掉。并且,传递的相对到期时间必须是一个整数,否则定时器失效。

断续器,类似crontab,用于定时触发

 

加锁:互斥锁+读写锁

互斥锁能对共享资源的访问唯一性进行控制,防止竞态

读写锁,写与写互斥,读与写互斥,读与读共享

 

sync.once 只执行一次,哪怕是放到循环中去

临时对象池,就像缓存池,具备伸缩性和垃圾回收机制,获取数据是随机的,对该池中的取值不要抱有确切的期待

 

进程状态切换(如图)

进程同步:原子操作+临界区(如图)

 

 

多线程编程:

线程状态(如图)

 

线程调度(如图)

 

线程模型(如图)

线程同步(如图):互斥+条件=>线程安全性

go并发机制:

线程实现模型(如图)

调度器(如图)

 

 

goroutine和channel(代码)

 

go同步:锁 条件变量 原子操作 单次执行 waitGroup 对象池 (代码)

 

其他内容:

https://blog.youkuaiyun.com/li_101357/article/details/80281530

https://www.cnblogs.com/aaronthon/p/10946433.html

https://segmentfault.com/a/1190000019582694

https://blog.youkuaiyun.com/xxywxlyygx/article/details/87383266

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值