20、go并发编程基本概念

基本概念

进程/线程

进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位


线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位


一个进程可以创建和撤销多个线程,同一个进程中的多个线程之间可以并发执行

并发/并行

多线程程序在单核心的cpu上运行,称为并发;多线程程序在多核心的CPU上运行,称为并行


并发与并行并不相同,并发主要由切换时间片来实现“同时”运行,并行则是利用多核实现多线程的运行,Go程序可以设置使用核心数,以发挥多核计算机的能力

协程/线程

协程:独立的栈空间,共享堆空间,调度由用户自己控制,本质上有点类似于用户级线程,这些用户级线程的调度也是自己实现的


线程:一个线程上可以跑多个协程,协程是轻量级的线程

1、协程Coroutine

简介

1.协程是一种轻量级的“线程”
2.协程是非抢占式的多任务处理,由协程内部主动交出控制权
3.协程是编译器/解释器/虚拟机层面的多任务(不是操作系统层的多任务,操作系统只有线程,没有协程,go语言中可以看做是编译器级别的多任务,编译器会把go function解释成一个协程,具体执行上go语言有一个调度器,用来调度协程,)
4、多个协程可能在一个或者多个线程上运行(由调度器来决定的)
5、go语言协程中若有io操作则会进行协程间的切换(因为io操作会有等待的过程)

数据访问冲突检测命令

数据访问冲突检测:
go run -race file_name.go

goroutine

func main(){
	var a [10]int
	for i := 0; i < 10; i++ {
		//定义一个
		go func(i int){
			a[i]++
		}(i)
	}
	time.Sleep(time.Millisecond)
	fmt.Println(a)
}

goroutine可能切换的点

下方只是参考,不能保证切换,不能保证在其他地方不切换
1、I/O(fmt.Println(“xx”))、select
2、channel
3、等待锁
4、函数调用(有时会切换,由调度器决定)
5、手动交出控制器:runtime.Gosched()

2、抢占式和非抢占式区别

go语言的协程会在io操作时进行协程的切换(因为io操作会有等待的过程)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值