单通道并发机制

部署狂
• 阅读 1668

communicating sequential processes (CSP)机制的提出非常古老(在1978年),它不同于erlang的actor model。go语言实现的CSP使用的通道会让消息的发送与接收更加解耦。

一、go语言的channel机制

1、阻塞式

单通道并发机制

接收者与发送者必须都在才能完成消息的发送与接收,如果发送者不在,接收者就必须等待,如果接收者不在,发送者也必须等待

2、非阻塞式
单通道并发机制

这种被称为buffer channel,是更加松耦合的实现方式,发送者与接收者各自独立,只要消息队列未满,发送者可以一直向channel中写入msg,只要消息队列不空,接收者可以一直从channel中取msg。

二、代码实现

串行执行

func service() string {
    time.Sleep(time.Millisecond * 50)
    return "Done"
}

func otherTask() {
    fmt.Println("working on sth else")
    time.Sleep(time.Millisecond * 100)
    fmt.Println("Task is done")
}

func TestService(t *testing.T) {
    fmt.Println(service())
    otherTask()
}

输出:

Done
working on sth else
Task is done

使用channel改造成CSP:

func AsyncService() chan string {
    retCh := make(chan string)
    go func() {
        ret := service()
        fmt.Println("return result")
        retCh <- ret
        fmt.Println("service exited")
    }()
    return retCh
}

func TestAsyncService(t *testing.T) {
    retCh := AsyncService()
    otherTask()
    fmt.Println(<-retCh)
    time.Sleep(time.Second * 1)
}

执行结果:

working on sth else
return result
Task is done Done
service exited

由于是阻塞式的,所以发送者一直等接收者取走msg之后才退出,所有最后才打印"service exited"

改造成非阻塞式的:

func AsyncService() chan string {
    retCh := make(chan string, 1)
    go func() {
        ret := service()
        fmt.Println("return result")
        retCh <- ret
        fmt.Println("service exited")
    }()
    return retCh
}

输出结果:

working on sth else
return result
service exited
Task is done
Done

发送者完成消息发送就退出了

点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Wesley13 Wesley13
4年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Jacquelyn38 Jacquelyn38
4年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
4年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Java的SPI机制详解
作者:京东物流杨苇苇1.SPI简介SPI(ServiceProvicerInterface)是Java语言提供的一种接口发现机制,用来实现接口和接口实现的解耦。简单来说,就是系统只需要定义接口规范以及可以发现接口实现的机制,而不需要实现接口。SPI机制在J
京东云开发者 京东云开发者
9个月前
Java的SPI机制详解
作者:京东物流杨苇苇1.SPI简介SPI(ServiceProvicerInterface)是Java语言提供的一种接口发现机制,用来实现接口和接口实现的解耦。简单来说,就是系统只需要定义接口规范以及可以发现接口实现的机制,而不需要实现接口。SPI机制在J
京东云开发者 京东云开发者
8个月前
Java的SPI机制详解
作者:京东物流杨苇苇1.SPI简介SPI(ServiceProvicerInterface)是Java语言提供的一种接口发现机制,用来实现接口和接口实现的解耦。简单来说,就是系统只需要定义接口规范以及可以发现接口实现的机制,而不需要实现接口。SPI机制在J
京东云开发者 京东云开发者
8个月前
Java的SPI机制详解
作者:京东物流杨苇苇1.SPI简介SPI(ServiceProvicerInterface)是Java语言提供的一种接口发现机制,用来实现接口和接口实现的解耦。简单来说,就是系统只需要定义接口规范以及可以发现接口实现的机制,而不需要实现接口。SPI机制在J
部署狂
部署狂
Lv1
明朝望乡处,应见陇头梅。
文章
3
粉丝
0
获赞
0