go语言学习笔记 — 进阶 — 并发编程:go语言的协程goroutine,与普通程序的协程coroutine
Posted Locutus
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了go语言学习笔记 — 进阶 — 并发编程:go语言的协程goroutine,与普通程序的协程coroutine相关的知识,希望对你有一定的参考价值。
拿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语言学习笔记 — 进阶 — 并发编程:go语言的协程goroutine,与普通程序的协程coroutine的主要内容,如果未能解决你的问题,请参考以下文章
go语言学习笔记 — 进阶 — 并发编程:调整并发的运行性能(GOMAXPROCS)
go语言学习笔记 — 进阶 — 并发编程:go语言的协程goroutine,与普通程序的协程coroutine
go语言学习笔记 — 进阶 — 并发编程:通道(channel) —— 在多个goroutine之间通信的管道
go语言学习笔记 — 进阶 — 并发编程:通道(channel)—— 使用channel收发数据