Go 并发

Go 并发

二十二、并发

1、

1)主线程是一个物理线程,直接作用在cpu上,是重量级的,非常消耗cpu资源

2)协程从主线程开启,是轻量级的线程,是逻辑态,对资源消耗相对小

3)golang的协程机制是重要的特点,可以轻松开启上万个协程。其他编程语言的并发机制是一般基于线程的,开启过多的线程,资源耗费大,这就突显golang在并发上的优势了

2、goroutine 是轻量级线程(可以叫做协程)

goroutine 的调度是由 Golang 运行时进行管理的

3、goroutine的调度模型:MPG模型

1)M:操作系统的主线程(是物理线程)
2)P:协程执行需要的上下文
3)G:协程

4、goroutine 语法格式

go 函数名(参数列表)

例:go f(x,y,z)
开启一个新的 goroutine:f(x,y,z)

5、goroutine

Go 允许使用 go 语句开启一个新的运行期线程, 即 goroutine,以一个不同的、新创建的 goroutine 来执行一个函数。 同一个程序中的所有 goroutine 共享同一个地址空间。

6、通道(channel)

(1)通道是用来传递数据的一个数据结构

(2)通道可用于两个goroutine之间通过传递一个指定类型的值来同步运行和通讯。操作符<-用于指定通道的方向,发送或接收。如果未指定方向,则为双通道。

(3)通道声明格式:

ch := make(chan int) 
或者 
var 变量名 chan 数据类型    
变量名 = make(chan 数据类型) 

注:通道在使用前必须先创建,make后才能使用。默认情况下,通道是不带缓冲区的。发送端发送数据,同时必须有接收端相应的接收数据。
例:

ch <- v   //把v发送到通道ch
v := <-ch //从ch接收数据并把值赋给v

(4)通道缓冲区
通道可以设置缓冲区,通过make的第二个参数指定缓冲区的大小:ch := make(chan int,100)
注:如果通道不带缓冲区,发送方会阻塞直到接收方从通道中接收了值。如果通道带缓冲,发送发则会阻塞直到发送的值被拷贝到缓冲区;如果缓冲区已满,则意味着需要等待直到某个接收方获取到一个值,接收方在有值可以接收之前会一直阻塞。

(5)channel本质就是一个数据结构-队列

(6)数据是先进先出

(7)线程安全,多goroutine访问时,不需要加锁,channel本身就是线程安全的

(8)channel有数据类型

(9)给管道写入数据时,不能超过其容量,可以边取边存

(10)当管道关闭时,不能再写入,但是可以读

(11)如果遍历时,不将管道关闭,虽然数据取出但是会报死锁,所以在遍历之前,应将管道关闭即close(ch)

7、遍历通道与关闭通道

v, ok := <-ch //如果通道接收不到数据后ok为false,这时通道就可以使用close(ch)函数来关闭,ch是管道变量名

8、协程的特点

1)有独立的栈空间;
2)共享程序堆空间;
3)调度由用户控制;
4)协程是轻量级的线程

实例

例1:

package main

import (
	"fmt"
	"runtime"
	"time"
)

func test(str string)  {
	for i := 1;i<=5;i++ {
		fmt.Println(str)
		time.Sleep(time.Second) //每隔一秒执行一次
	}
}

func main()  {
	go test("hello world")
	test("hello golang")
	n := runtime.NumCPU() //查看本机有多少个cpu
	fmt.Println("cpu个数为:",n)
}

例2:

package main

//计算1-20的各个数的阶乘,并放入map中,并显示,使用goroutine实现

var(
	myMap = make(map[int]int,10)
)
func test(n int)  {
	res :=1
	for i:=1;i<=n;i++ {
		res *=i
	}
	myMap[n]=res
}

func main()  {
	//这里开启多个协程完成这个任务
	for i := 1;i<=20;i++ {
		go test(i)
	}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值