1 什么是routine(协程)
go routine 是属于go的一个很重要的特性,是go并发编程的一部分,如同讲到并发的时候,线程是不可忽略的一个概念。
那么routine是什么,routine中文叫做协程。对于协程,你需要了解这个是一个概念级产品,由程序员自己控制的编程模式即可。
实际的操作系统如linux通过如ps,top等是看不到协程的实体的,但是可以看到进程和线程的实体,有内存的分配和调度,还有cpu调度。
协程就是业务代码的协助,是逻辑的控制。
2 routine(协程)有什么特性
说起routine(协程)的特性,那就需要对线程和进程进行对比来说明。
对比协程和线程有什么优势,可以关注下——协程可以启动10万个,然后对应的底层线程数量是可以控制的(通过编程控制),协程启动10万个,对内存没啥消耗。但是线程启动10万个,按照每个平均2M的堆栈空间(操作系统默认分配)计算,计算机内存成本会非常高(要不你去算算,留言告诉我们是内存要多大)。
协程是程序员代码根据业务逻辑进行调度控制的,线程和进程是操作系统进行调度控制的。
协程是一个循环,会不停的执行(如果程序没有控制时钟或者事件选择的话),运行阶段,协程之间是线程公用的,线程不安全的,你也可以认为协程就是某一段时间的某个线程的执行路径。
3 routine(协程)应用场景
服务端高并发开发——做服务端开发的时候需要routine,需要做一个高并发的服务端,包括独立的读routine,写routine,以及接收连接routine,以及业务routine,每个打包和解包的routine等。
类似map-reduce的分布式计算——可以使用routne(协程)模式进行设计,采用动态生成routine(协程)的方式进行任务的计算,然后通过技术手段(后面会介绍的channel)进行结果汇总。最后达成map-reduce计算。
独立的业务逻辑开发——可以采用独立的routine,业务可以分模块,模块化开发,都比较适合进行routine(协程)的开发模式设计。
4 routine(协程)例子
简单的routine语法:go 方法名
右边是没有有routine的例子。输出结果如下:是完全打完了Foo才打印Bar的。
左边是有routine的例子。输出结果如下:是错开的进行打印的(是并行)。
5 routine(协程)使用注意问题
routine(协程)需要一种调度方式和通信方式(channel)
routine(协程)需要注意堆栈数据访问的线程安全
routine(协程)需要控制执行顺序,需要业务代码逻辑控制
routine(协程)不是简单的go。
网友评论