Golang的goroutine协程和channel通道

一:简介

因为并发程序要考虑很多的细节,以保证对共享变量的正确访问,使得并发编程在很多情况下变得很复杂。
但是Go语言在开发并发时,是比较简洁的。它通过channel来传递数据。数据竞争这个问题在golang的设计上就进行了规避了。它提倡用通信的方式实现共享,而不要以共享方式来通信
Go语言用2种手段来实现并发程序,goroutine和channel,其支持顺序通信进程(communicating sequential processes),简称为CSP。CSP是一种现代的并发编程模型,在这种编程模型中,值会在不同的运行实例(goroutine)中传递。

二:Goroutine

在Go语言中,每一个并发的执行单元就叫做goroutine。
每个goroutine都对应一个非常简单的模型:它是一个并发的执行函数,并且在多个并发的goroutine间,资源是共享的。goroutine非常轻量,创建的开销很少。

goroutine的用法:
直接在函数前加上一个关键字:go。
go func() {}

例子:

package main

import (
	"fmt"
	"time"
)

func main() {
   
	fmt.Println("In main")
	go longSleep()
	go shortSleep()

	fmt.Println("sleep ")
	time.Sleep(10 * 1e9)//ns,符号 1e9 表示 1 乘 10 的 9 次方,e=指数
	fmt.Println("the end of main")
}

func longSleep() {
   
	fmt.Println("longSleep begin")
	time.Sleep(5 * 1e9)
	fmt.Println("longSleep end")
}

func shortSleep() {
   
	fmt.Println("shortSleep begin")
	time.Sleep(2 * 1e9)
	fmt.Println("shortSleep end")
}

运行结果:

In main
sleep
longSleep begin
shortSleep begin
shortSleep end
longSleep end
the end of main

main() ,longSleep() 和 shortSleep() 这3个函数都是独立的处理单元按顺序启动,然后开始并行运行。为了模拟
运算时间的损耗,我们使用了sleep()函数,这个函数可以按照指定时间来暂停函数或协程执行。

如果我们不在main()函数中sleep()较长的时间,那么main() 函数结束时,其他协程运行的程序也会结束。main()程序退出,它不会等待任何其他非main协程的结束。
协程是独立的处理单元,一旦陆续启动一些协程,就无法确定他们是什么时候正在开始运行的。

三:通道channel

上面我们讲到,协程都是独立运行的,他们之间没有通信。
协程可以使用共享变量来通信,但是不建议这么做。在Go中有一种特殊的类型channle通道,可以通过它来进行goroutine之间的通信,可以避免共享内存的坑。channel的通信保证了同步性。
数据通过通道,同一时间只有一个协程可以访问数据,所以不会出现数据竞争,设计时就是这样的。

3.1 channel语法

channel也是通过make进行分配的,其返回的是指向底层相关数据结构的引用。

  • 1、基础语法
var chan1 chan string
chan1 = make(chan string)
//or
chan1 := make(chan string)

//int 
intchan := make(chan int)

//函数也可以
funcchan := chan func()

  • 2、不带缓冲的channel
var chan2 chan 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值