美文网首页
【语言学习】Go语言之routine特性

【语言学习】Go语言之routine特性

作者: 万能的华哥Dean | 来源:发表于2019-01-27 07:39 被阅读48次

    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。

    相关文章

      网友评论

          本文标题:【语言学习】Go语言之routine特性

          本文链接:https://www.haomeiwen.com/subject/spqgjqtx.html