go语言学习笔记—进阶—并发编程:go语言的协程goroutine,与普通程序的协程coroutine

Locutus Locutus     2023-01-19     204

关键词:

拿Python程序的coroutine与Go程序的goroutine做比较,两者都可以把函数或语句运行在独立的环境,但还是有不同点:

  • goroutine可能并行执行,但coroutine始终顺序执行

狭义地说,goroutine可能发生在多线程环境下。goroutine无法控制自己获得高优先级支持;coroutine始终发生在单线程,coroutine程序需要主动交出CPU控制权,宿主操作系统才能获得控制权并重新分配给其他coroutine。

  • goroutine之间使用通道channel通信,coroutine使用yield和resume操作

coroutine的运行机制属于协作式任务处理。早期操作系统要求每个应用程序必须遵循操作系统的任务处理规则:应用程序在不需要使用CPU时,需要主动交出CPU控制权。如果开发者无意或故意使应用程序长时间占用CPU,操作系统也无能为力,最后OS很容易失去响应或死机。

goroutine的运行机制属于抢占式任务处理。这与多进程和多线程任务处理非常类似,操作系统如果发现一个应用程序长时间大量占用CPU,那么用户有权终止这个任务。

go并发编程

协程  执行体是个抽象的概念,在操作系统层面有很多个概念与之对应,如操作系统自己掌管的进程(process),进程内的线程(thread),以及进程内的协程(coroutine,也叫轻量级线程).与传统的线程和进程比,协程的最大优势在于其"轻量级",... 查看详情

go语言学习笔记—进阶—并发编程:轻量级线程goroutine——并发与并行

并发编程并发指在同一时间内可以执行多个任务。并发编程包含多线程编程、多进程编程、分布式程序等。go语言的并发是指多线程并发,通过goroutine完成goroutine类似线程,可以根据需要创建多个goroutine并发工作goroutine是... 查看详情

2021-go语言并发编程

2021-GO语言并发编程1、Go语言并发概述2、GO语言多进程编程3、Go语言并发简略-多线程4、Go语言并发简略-非阻塞IO5、Go语言并发简略-协程6、并发简略-对比并发模型7、Go语言goroutine8、Go语言channel9、Go语言channel的操作10、Go语言channel... 查看详情

2021-go语言并发编程

2021-GO语言并发编程1、Go语言并发概述2、GO语言多进程编程3、Go语言并发简略-多线程4、Go语言并发简略-非阻塞IO5、Go语言并发简略-协程6、并发简略-对比并发模型7、Go语言goroutine8、Go语言channel9、Go语言channel的操作10、Go语言channel... 查看详情

go语言学习笔记—进阶—并发编程:为函数创建goroutine(代码片段)

使用go关键字为一个函数创建一个goroutine。函数与goroutine是一对多的关系,即可以为一个函数创建多个goroutine,一个goroutine必定只对应一个函数。为普通函数创建goroutine格式为一个go函数创建goroutine,写法如下:go... 查看详情

对于go语言的进阶与依赖管理|青训营笔记(代码片段)

一.Go语言进阶与依赖管理1.1并发和并行Go可以充分发挥多核优势,高效运行。多线程程序在单核心的cpu上运行,称为并发;多线程程序在多核心的cpu上运行,称为并行。并发与并行并不相同,并发主要由切换时间片来实现“同时... 查看详情

go语言学习笔记—进阶—并发编程:调整并发的运行性能(gomaxprocs)(代码片段)

go语言的运行时(runtime)实现了一个小型任务调度器,它类似于操作系统的线程调度,可以高效地把CPU资源分配给每一个任务。通过runtime.GOMAXPROCS()函数,可以指定线程池中线程与CPU核心数量的对应关系,如下:... 查看详情

go语言并发编程(代码片段)

...万个。这也是协程也叫轻量级线程的原因。golang原生支持并发编程轻量级线程非抢占式多任务处理,由协程主动交出控制权编译器/解释器/虚拟机层面的多任务多个协程可能在一个或多个线程上运行1.1go对协程的实现goroutine--Go对... 查看详情

2.1go微服务实战(go语言进阶)---并发编程进阶

第8章 并发编程进阶8.1 竞态与并发模式 8.1.1 数据竞态 8.1.2 并发原理8.2 sync包 8.2.1 sync.Mutex互斥锁 8.2.2 sync.RWMutex多读写锁 8.2.3 sync.Once 8.2.4 sync.Cond 8.2.5 sync.Pool 8.2.6 sync.Map8.3 context包 8.3.1 应用场景 8.3.2 定义 8.3.3... 查看详情

go语言学习笔记—进阶—并发编程:通道(channel)——使用channel收发数据(代码片段)

创建channel之后,我们可以使用channel进行数据收发操作。使用channel发送(填充)数据使用特殊的操作符<-,把数据通过channel发送。格式通道变量<-值通道变量是上文通过make创建的通道实例;值可以是变量... 查看详情

go语言学习笔记—进阶—并发编程:通道(channel)——在多个goroutine之间通信的管道(代码片段)

单纯地并发执行函数是无意义的,函数之间需要交换数据才能体现并发执行的意义。虽然可以使用“共享内存”的方式交换数据,但共享内存在不同goroutine间易发生竞态问题。为了保证数据交换的正确性,必须使用互... 查看详情

go语言学习笔记—进阶—并发编程:通道(channel)——各种各样的通道(代码片段)

单向通道在声明通道时,我们可以设置只发送或只接收。这种被约束操作方向的通道称为单向通道。声明单向通道只发送:chan<-,只接收:<-chanvar通道实例chan<-元素类型//只发送数据var通道实例<-chan元素... 查看详情

go语言学习笔记—进阶—并发编程:同步sync,竞态检测——检测代码在并发环境下出现的问题(代码片段)

使用channel在多个goroutine之间交换数据,只是数据同步方法的一种。通道内部的实现依然使用各种锁。优雅代码的代行是性能。在某些轻量级场合,原子访问(atomic包)、互斥锁(sysnc.Mutex)以及等待组࿰... 查看详情

云原生时代崛起的编程语言go并发编程实战(代码片段)

Go语言是天然并发利器,通过通信来实现内存共享而不是通过共享内存来通信,本篇从了解Go的并发哲学、理论及并发原语开始,之后用一个个Go代码示例认识Go的协程、通道、定时器、互斥锁、池化、原生操作等十几个并发编程... 查看详情

go语言学习之旅--并发编程

Go语言学习之旅--并发编程golang并发编程之协程golang并发编程之通道golang并发编程之WaitGroup实现同步golang并发编程之runtime包golang并发编程之Mutex互斥锁实现同步golang并发编程之channel的遍历golang并发编程之selectswitchgolang并发编程之T... 查看详情

go语言学习之旅--并发编程

Go语言学习之旅--并发编程golang并发编程之协程golang并发编程之通道golang并发编程之WaitGroup实现同步golang并发编程之runtime包golang并发编程之Mutex互斥锁实现同步golang并发编程之channel的遍历golang并发编程之selectswitchgolang并发编程之T... 查看详情

1.5go微服务实战(go语言基础)---并发编程

第5章 并发编程 Go语言的多线程是基于消息传递的,Go语言将基于CSP模型的并发编程内置到了语言中,其特点就是goroutine之间是共享内存的。5.1 协程 协程是Go语言特有的一种轻量级线程,实际上,所有的Go语言... 查看详情

go语言学习笔记—进阶—并发编程(11):同步sync,等待组(sync.waitgroup)——保证在并发环境中完成指定数量的任务(代码片段)

除了使用通道channel和互斥锁sync.Mutex进行两个并发程序间的同步,我们还可以使用等待组(sync.WaitGroup)进行多个任务之间的同步。方法名功能(wg*WaitGroup)Add(deltaint)等待组的计数器+1(wg*WaitGroup)Done()等待组的计数器-1(... 查看详情