协程是什么

问题
公认的,使用多线程的应用难以做到准确,最主要的问题是内存中的数据共享,他们会被多线程以无法预知的方式进行操作,导致一些无法重现或者随机的结果,叫竞态
不要使用全局变量或者共享内存,他们会给你的代码在并发运算时带来危险。

解决
同步不同的线程,对数据加锁,这样同时就只有一个线程可以变更数据。不过过去的软件经验告诉我们这会带来更高的复杂度,更容易使代码出错以及更低的性能,所以这个经典的方法明显不再适用多核/多处理器编程,模型如下:one thread per connenction https://www.iteye.com/blog/iunknown-58172

在Go中,应用程序并发处理的部分称作 goroutines(协程),它可以进行更有效的并发运算。在协程和操作系统线程之间并无一对一的关系,协程是根据一个或多个线程的可用性,映射在(多路复用,执行与)他们之上的,协程调度器在Go运行时很好的完成了这个工作。协程工作在相同的地址空间中,所有共享内存的方式一定是同步的,这个可以使用sync包来实现,不过我们不鼓励这样做,Go使用Channels来同步协程

在系统调用阻塞协程(比如阻塞IO)的时候,其他协程会继续在其他线程上工作,协程的设计隐藏了许多线程创建和管理方面的工作

协程的创建非常廉价,必要时候可以轻松创建并运行大量的协程,在同一个地址空间中100000个连续的协程,并且他们对栈进行了分隔,从而动态的增加或减少内存的使用,栈的管理是自动的,但不是垃圾回收器管理的,而是在协程退出后自动释放

协程可以运行在多个操作系统线程之间,也可以运行在线程之内,让你可以很小的内存占用就可以处理大量的任务。由于操作系统线程上的协程时间片,你可以使用少量的操作系统线程就能拥有任意多个提供服务的协程,而且Go运行时可以聪明的意识到哪些协程阻塞了,暂时搁置他们处理其他协程

并发方式两种:

确定性的(明确定义排序)
Go的协程和通道支持确定性的并发方式

非确定性的(加锁/互斥从而未定义排序)

协程的使用

通过关键字调用执行一个函数或者方法来实现的,也可以是匿名或者lambda函数,这样会在当前的计算过程中,开始一个同时进行的函数,在相同的地址空间中并分配了独立的栈,协程的栈会自动伸缩,不出现栈溢出,开发者不需要关心栈的大小,当协程结束的时候它会自动释放,静默退出,用来启动这个协程的函数不会得到任何的返回值

任何Go程序都必须有的main函数,也可以看作是一个协程,尽管它并没有通过go来启动,协程可以在程序初始化的过程中运行,在init函数中。

为了让计算均匀分布,使通讯不至于迟迟得不到响应,可以在运算循环中周期性的使用runtime.Gosched,这会让出处理器,允许运行其他协程,它并不会让当前协程挂起,所以它会自动回复执行。

并发和并行的差异

并发程序有可能是并行的,有可能不是,并行是一种通过使用多核处理器以提高速度的能力,但往往是,一个设计良好的并发程序在并行方面也比较出色

GO默认没有并行指令,只有一个独立的核心或者处理器被专门用于Go程序,不论它启动了多少个协程,所有这些协程是并发运行的,但他们不是并行的,同一时间只有一个协程会处在运行状态

使用 GOMAXPROCS,GOMAXPROCS 等同于(并发的)线程数量,在一台核心数多于1个的机器上,会尽可能有等同于核心数的线程在并行运行。

协程可以通过调用runtime.Goexit()来停止,尽管这样做几乎没有必要。

协程的生命周期

如果我们不在 main() 中等待,协程会随着程序的结束而消亡。

当 main() 函数返回的时候,程序退出:它不会等待任何其他非 main 协程的结束。这就是为什么在服务器程序中,每一个请求都会启动一个协程来处理,server() 函数必须保持运行状态。通常使用一个无限循环来达到这样的目的。

另外,协程是独立的处理单元,一旦陆续启动一些协程,你无法确定他们是什么时候真正开始执行的。你的代码逻辑必须独立于协程调用的顺序。

Go 协程(goroutines)和协程(coroutines)区别

Go 协程意味着并行(或者可以以并行的方式部署),协程一般来说不是这样的
Go 协程通过通道来通信;协程通过让出和恢复操作来通信
Go 协程比协程更强大,也很容易从协程的逻辑复用到 Go 协程。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值