聊聊并发,进程通信方式,go协程简单应用场景

开篇提问

  1. 知道并发,并行,线程,协程概念吗?或者知道大概含义吗?
  2. 有线程为什么还要有协程?区别是什么?
  3. 『进程』通信方式知道几种?有没有超过3种?
  4. golang『协程』通信方式推荐?
  5. 使用并发的目的是为什么?是能帮我们解决什么问题吗?

概念

并发,线程,协程:概念是不可能概念的,google去吧。或者点击这里,查看上一篇文章

  • 并行:一般是指多个CPU实例或者多台机器在『同一时刻』同时执行某个逻辑(方法)

『进程』通信方式

名称 特点
管道/匿名管道(pipe) 管道的实质是一个内核缓冲区
有名管道(FIFO) 先进先出(first in first out);
以有名管道的文件形式存在于文件系统中;
信号(Signal) 无需知道该进程的状态;
阻塞进程;
异步通信;
消息队列(Message Queue) 放在内核中的消息链表;
允许一个或多个进程向它写入与读取消息;
克服了信号承载信息量少缺陷;
目前主要有两种类型的消息队列:POSIX消息队列以及System V消息队列,系统V消息队列目前被大量使用;
共享内存(share memory) 使得多个进程可以可以直接读写同一块内存空间,是最快的可用IPC形式;
由于多个进程共享一段内存,因此需要依靠某种同步机制(如信号量)来达到进程间的同步及互斥;
信号量(semaphore) 信号量是一个计数器,用于多进程对共享数据的访问,信号量的意图在于进程间同步只能通过两个标准原子操作:wait(semap) , signal(semap) ;进行访问
信号量是非负整型变量
操作也被成为PV原语(P来源于荷兰语proberen"测试",V来源于荷兰语verhogen"增加",P表示通过的意思,V表示释放的意思)
套接字(socket) 套接字是支持TCP/IP的网络通信的基本操作单元
套接字的特性由3个属性确定,它们分别是:域、端口号、协议类型。
image

信号量与互斥量之间的区别:
(1)互斥量用于线程的互斥,信号量用于线程的同步。这是互斥量和信号量的根本区别,也就是互斥和同步之间的区别。
互斥:是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。
同步:是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。
在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源
(2)互斥量值只能为0/1,信号量值可以为非负整数。
也就是说,一个互斥量只能用于一个资源的互斥访问,它不能实现多个资源的多线程互斥问题。信号量可以实现多个同类资源的多线程互斥和同步。当信号量为单值信号量是,也可以完成一个资源的互斥访问。
(3)互斥量的加锁和解锁必须由同一线程分别对应使用,信号量可以由一个线程释放,另一个线程得到。

go协程通讯使用

基本上就是推荐使用channel,这个是最推荐的使用形式;

还有就是使用sync.Mutex互斥锁进行加锁通讯;

更详细的介绍以后写;

go使用协程一些应用场景,简单举例

  1. 进行互不相干的『循环』,需要等待结果计算

这种情况下,一般是不同『数据集合』需要进行『处理』,在处理的过程中两个数据集合对『结果』造成的影响没有时序行

这种情况下,完全可以采用两个数据单独进行协程处理然后再进行后续运算;

// 伪代码
var result, data1, data2 int32
done1 := make(chan bool)
done2 := make(chan bool)
// 第一个数据集合,需要求和
go func() {
    for _, val := range dataset1 {
        data1 += val
    }
    done1 <- true
}

// 第二个数据集合,需要求和
go func() {
    for _, val := range dataset2 {
        data2 += val
    }
    done2 <- true
}

// 等待协程完成运算
<-done1
<-done2

// 结果进行相加
result = data1 + data2
  1. 需要额外进其他不相干的业务,不耽误『主协程』的返回值,不等待

一般有些业务处理以后,有些『额外工作』需要处理但是不耽误主协程返回数据,这个时候就可以开个协程去做,不用等待

// 伪代码

result, err := processMethod()
if err != nil {
    .....
}
// 需要对结果进行写缓存等其他操作,不耽误数据返回
go func() {
    err = saveRedis(result)
    if err != nil {
        .....
    }
}

return result
  1. 对某些任务进行时间限制,『超时关闭』当前操作

例如,通过管道channel发送某些数据,若超时则自动放弃本次发送,关闭通道。

// 定义两个有缓冲通道,容量分别为1
c1 := make(chan string, 1) 
c2 := make(chan string, 1)

go func() {                     
    time.Sleep(time.Second * 1) // 隔1秒发送数据
    c1 <- "data1"        
}()

go func() {
    time.Sleep(time.Second * 6) // 隔6秒发送数据
    c2 <- "data2"             
}()

for i := 0; i < 2; i++ {    
    // 给通道创建容忍时间,如果5s内无法读写,就即刻返回
    tm := time.NewTimer(time.Second * 5) 
    // 使用select来获取这两个通道的值,然后输出
    select {
        case data1 := <-c1:          // 接收c1通道数据(消费数据)
            fmt.Println(msg1)
        case data2 := <-c2:          // 接收c2通道数据(消费数据)
            fmt.Println(msg2)
        case <-tm.C:
            fmt.Println("timeout!")
    }
}

篇末提问

  1. 使用过协程吗?知道协程与线程的区别吗?
  2. 如果是单核CPU,开协程会有用吗?
  3. 本文由于没有帮助你提升code能力?
  4. 进程通讯方式有没有一点点了解?
  5. 你会使用本文的协程案例提升运行速度吗?
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345

推荐阅读更多精彩内容