博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Go语言的并发模式
阅读量:2177 次
发布时间:2019-05-01

本文共 1931 字,大约阅读时间需要 6 分钟。

Go语言的并发模式)

1、约束

保证操作安全的方法:

  1. 用于共享内存的同步原语 (锁,sync.Mutex)
  2. 通过通信共享内存来进行同步(channel)
  3. 隐式并发安全: 不会发生改变的数据和受保护的数据
    在并发编程中,不可变数据是理想的,它隐式的并行安全。
    并发进程之间可以对相同的数据操作,但是不能修改,如果创建新数据,就需要创建所需修改的数据的新副本,可以提高开发效率和程序运行速度,使得程序临界区减少。
    两种可能的约束:特定约束和词法约束

特定约束:即通过约定来实现的,在大型项目中很难保证。例子:

data := make([]int, 4)loopData := func( handleData chan<- int){	defer close(handleData)	for i := range data {		handleData <- data[i]	}}handleData := make(chan int)go loopData(handleData)for num := range handleData {	fmt.Println(num)}https://play.golang.org/p/f-EpjaA2k6G在loopData函数和handleData channel里的循环都可以使用data切片。但是我们希望的是在loopData中使用,因此随着时间和更多的人使用代码,约束也会被打破。

词法约束: 涉及使用词法作用域仅公开用于多个并发进程的正确数据和并发原语;例子:

1、channel相关

func main() {	chanOwner := func() <-chan int {		results := make(chan int, 5)		// 1		go func() {			defer close(results)			for i := 0; i <= 5; i++ {				results <- i			}		}()		return results	}	consumer := func(results <-chan int) {   // 3		for result := range results {			fmt.Printf("Received: %d\n", result)		}		fmt.Println("Done")	}	results := chanOwner()	// 2	consumer(results)}https://play.golang.org/p/qUSo5ISc0gz1、例子中chanOwer函数在词法范围内实例化channel,防止channel被其他goroutine改写2、收到channel的读处理,并将其传递给消费者3、收到channel的只读副本,consumer的作用就是对channel的只读处理这个就是和对结构体字段的get和set的道理是一样的,对读写进行分离

2、普通的并发不安全的

printData := func(wg *sync.WaitGroup, data []byte) {		defer wg.Done()		var buff bytes.Buffer		for _, b := range data {			fmt.Fprintf(&buff, "%c", b)		}		fmt.Println(buff.String())	}	var wg sync.WaitGroup	wg.Add(2)	data := []byte("golang")	go printData(&wg, data[:3])	go printData(&wg, data[3:])	wg.Wait()	可以看到printData不能直接访问data的数据,必须要占用data的一部分或者全部才能对data进行操作	这样就约束了goroutine只能去操作我们传进去的数据而不是其他数据,在这里我们可以不通过通信来完成内存访问同步或共享数据。

通过前面的约束可以看到虽然建立约束是困难的,但是对于性能等的提高是明显的。

2、for-select循环

一般模式

for {	select {		// 使用channel进行操作	}}变体1、for {	select {	case <- done:		return 	default:	}	// 进行非抢占式任务}变体2for {	select {	case <- done:		return 	default:	// 进行非抢占式任务	}}

for-select这种模式经常会被用到,虽然看起来很简单。

转载地址:http://wcfkb.baihongyu.com/

你可能感兴趣的文章
【Pyton】【小甲鱼】类和对象:一些相关的BIF(内置函数)
查看>>
【Pyton】【小甲鱼】魔法方法
查看>>
单元测试需要具备的技能和4大阶段的学习
查看>>
【Loadrunner】【浙江移动项目手写代码】代码备份
查看>>
Python几种并发实现方案的性能比较
查看>>
[Jmeter]jmeter之脚本录制与回放,优化(windows下的jmeter)
查看>>
Jmeter之正则
查看>>
【JMeter】1.9上考试jmeter测试调试
查看>>
【虫师】【selenium】参数化
查看>>
【Python练习】文件引用用户名密码登录系统
查看>>
学习网站汇总
查看>>
【Python】用Python打开csv和xml文件
查看>>
【Loadrunner】性能测试报告实战
查看>>
【自动化测试】自动化测试需要了解的的一些事情。
查看>>
【selenium】selenium ide的安装过程
查看>>
【手机自动化测试】monkey测试
查看>>
【英语】软件开发常用英语词汇
查看>>
Fiddler 抓包工具总结
查看>>
【雅思】雅思需要购买和准备的学习资料
查看>>
【雅思】雅思写作作业(1)
查看>>