首页 > 其他 > 详细

并发并行

时间:2019-09-07 17:54:54      阅读:72      评论:0      收藏:0      [点我收藏+]

技术分享图片
技术分享图片
技术分享图片
技术分享图片
go通过信号量来实现高并发,

  • goroutine

    Go协程

    技术分享图片
    比线程更少

    关键字 go >>协程的创建

    技术分享图片
    当主协程退出的时候,子协程也跟着结束,
    技术分享图片
    技术分享图片

runtime

依赖于runtime包
import runtime

Gosched

让出时间,先让子协程执行
技术分享图片
技术分享图片
主协程进行累加,当i小于2的时候打印hello,虽然在程序前声明了go子协程的匿名函数,但是还没 来的及调用,主协程就执行完了,所以go子协程中的内容没有打印出来
技术分享图片
这个时候就可以是用Gosched了,让出主协程的时间,让子协程先执行。

技术分享图片
理解为一个时间阻塞,执行到runtime.Gosched()将阻塞,去执行其他的子协程。
技术分享图片

Goexit

技术分享图片

技术分享图片
技术分享图片
技术分享图片
技术分享图片
技术分享图片

GOMAXPROCS

技术分享图片
技术分享图片

  • channel

    技术分享图片

引入

多任务资源竞争问题

技术分享图片

信号管道,让协程可以指定时序执行

技术分享图片
技术分享图片

通过channel实现同步

技术分享图片

技术分享图片
两个go协程一起执行,在person2中,是要从管道取数据,如果没有这个数据,person2就会阻塞,一直等到有信号穿过来,这就使得person1可以先执行,传入信号量,person2再接收,就执行后续的操作。
技术分享图片

使用管道实现同步和数据交互

技术分享图片

无缓存的管道

技术分享图片
技术分享图片
类比两个人交互,在这个交互动作没有完成之前,两个人都是在交互中,协程就一直被阻塞,直到这个交互完成才会完成。就是说在没有完成这个交互之前,这两个人是不能去干其他事的,
技术分享图片
创建
技术分享图片

技术分享图片
len是指的缓存区剩余数据的个数,cap是指的缓存区指定的长度,对于无缓存得到channel来说,len和cap都是0
返回值的第一部分,打印了子谢承忠的第一个fmt,然后由主协程读取出来,一个写一个读,互相是阻塞的。首先是写入0,当延时两秒过后,主协程才读出0,管道完成一个交互,接触阻塞状态,然后继续写入,由于异步,打印的一下是吧1.2都写入了,主协程一下都读了

有缓存的channel

技术分享图片
技术分享图片
技术分享图片
技术分享图片

技术分享图片
技术分享图片

指定容量是3,打印出的容量值为3,

管道的读写,只有在管道容量满了的情况下才会阻塞,满了写不进去,空了读不出来
技术分享图片
技术分享图片
技术分享图片
容量为3,写入10个数据的时候
技术分享图片
写满三个就不再写了,进入阻塞状态,等管道另一侧读取完,解除阻塞状态,就可以继续写入了。

手动关闭管道

技术分享图片
技术分享图片

range

技术分享图片
技术分享图片

单方向的channel

技术分享图片
技术分享图片
普通管道转为单向管道是不可逆的,
技术分享图片

应用 -生产者消费者模型

技术分享图片

定时器 Timer

提供一个channel
技术分享图片
技术分享图片
技术分享图片
images.jianshu.io/upload_images/11743438-60a995fe8265ad8d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

应用 >> 通过timer实现延时

技术分享图片

停止和重置定时器

停止 timer.Stop()
重置timer.Reset(1*time.Second) 重置为1s
技术分享图片

Ticker

技术分享图片
技术分享图片

select

技术分享图片
技术分享图片

应用 >> 超时

技术分享图片
技术分享图片

并发并行

原文:https://www.cnblogs.com/0916m/p/11481988.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!