并发并发简述goroutine调度select多路复用01.02.04.目录channel通信机制03.sync并发控制05.01并发简述•进程,线程与协程•并发与并行•并发模型1并发简述线程进程协程进程是系统进行资源分配和调度的最小单位,由内核进行调度,拥有独立的内存单元。一个进程中的多个线程之间可以并发执行。线程是CPU调度的最小单位,比进程更小的能独立运行的基本单位,线程分为内核态线程和用户态线程,一个线程上可以运行多个协程。协程是轻量级的线程,独立的栈空间,共享堆空间,调度由用户自己控制。协程无法强制的切换CPU控制权,通常只能进行协作式调度。1并发简述ABC并发是多线程程序在单核心的cpu上运行,一个时间段内存在多个线程或进程执行,但任何时间点上都只有一个线程或进程执行,多个线程或进程争抢时间片轮流执行,单核处理器只能并发。并发1并发简述ABC并行是多线程程序在多核心的cpu上运行,一个时间段和时间点存在多个线程或进程执行,利用多核实现多线程的运行,并行需要多核处理器。并行1并发简述并发模型多进程编程多进程是在操作系统层面进行并发的基本模式,所有的进程由内核管理,相互之间不会影响,但系统开销较大。多协程编程用户态线程,不需要操作系统来进行抢占式调度,且在真正的实现中寄存于线程中,系统开销极小。多线程编程大部分操作系统上都属于系统层面的并发模式,比多进程的开销小很多,但是其开销依旧比较大,且在高并发模式下,效率会有影响。非阻塞/异步IO编程比多线程要复杂,通过事件驱动的方式使用异步IO,尽可能地少用线程,降低开销。02goroutine调度•goroutine定义•普通函数创建goroutine•匿名函数创建goroutine任何函数加上go就能发送调度器运行;不需要定义时区分是否异步函数;调度器在合适的点进行切换;使用-race检测数据访问冲突;2goroutine调度调度器goroutinegoroutine线程goroutinegoroutine线程goroutine2goroutine调度示例:go函数名(参数列表)函数名:调用的函数名;参数列表:调用函数需要传入的参数;running()goroutine终止main函数goroutinerunning函数goroutinemain()程序入口go普通函数()main函数终止普通函数创建goroutinefuncrunning(){//执行语法}funcmain(){//并发执行程序gorunning()}2goroutine调度running()goroutine终止main函数goroutine匿名函数goroutinemain()程序入口go匿名函数()main函数终止参数列表:函数体内的参数变量列表。函数体:匿名函数的代码。调用参数列表:启动goroutine时,需要向匿名函数传递的调用参数。匿名函数创建goroutinefuncmain(){gofunc(参数列表){函数体}(调用参数列表)}2goroutine调度funcrunning(namestring){vartimesintfor{times++fmt.Println(name,times)time.Sleep(time.Second)}}funcmain(){varnamestringname="并发"gorunning(name)}运行结果为:并发1并发2………..main函数中通过go关键字创建running函数goroutine并发运行;running函数中通过for实现无限循环,time.Sleep暂停1秒后继续循环,主函数退出时并发程序终止;2goroutine调度funcmain(){gofunc(){vartimesintfor{times++fmt.Println("并发",times)time.Sleep(time.Second)}}()}运行结果为:并发1并发2……..main函数中通过go关键字创建匿名函数goroutine并发运行;匿名函数中通过for实现无限循环,time.Sleep暂停1秒后继续循环,主函数退出时并发程序终止;03channel通信机制•通道的特性•通道的声明•通道数据接收与发送•无缓冲通道•有缓冲通道•通道超时机制3channel通信机制Go语言中的通道(channel)是一种特殊的类型。在任何时候,同时只能有一个goroutine访问通道进行发送和获取数据。goroutine间通过通道就可以通信。通道像一个传送带或者队列,总是遵循先入先出(FirstInFirstOut)的规则,保证收发数据的顺序。通道(channel)var通道变量通道类型注:chan类型的空值是nil,声明后需要配合make后才能使用1、声明通道类型3channel通信机制通道实例:=make(数据类型)2、创建通道var通道实例<-chan数据类型3、声明读取单向通道var通道实例chan<-数据类型4、声明写入单向通道readch:=make(chanint)...