为什么80%的码农都做不了架构师?>>>   

Go协程(Goroutine)是与其他函数同时运行的函数。可以认为Go协程是轻量级的线程。与创建线程相比,创建Go协程的成本很小。因此在Go中同时运行上千个协程是很常见的。

1、 Go语言的并发性

Go语言原生就支持了高并发操作,这一优秀基因在目前主流的编程语言中是比较少见的,Go语言的高并发性主要是通过 Go协程(Goroutine)来实现的。

协程的特点

  • 协程是一个轻量级的线程,此处可以与进程、线程、协程 进行对比
  • Go协程是非抢占式多任务处理,需要由协程主动交出控制权
  • 协程是一个 虚拟机层面的多任务处理
  • 多个协程可能运行在一个或者多个线程上

Go语言实现协程,只需要在函数前添加 go 关键字,就可以使此函数并发执行

示例代码如下:

package mainimport ("fmt""time"
)func main() {for i := 0; i < 1000; i++ {go func(i int) {for {fmt.Printf("Hello from "+"goroutine %d\n", i)}}(i)}time.Sleep(time.Millisecond)
}

2、其他语言中的协程

C++ 可以通过 Boost.Coroutine 库实现协程。

Java 不支持协程

Python 3.5  加入了 async def 对协程的支持,但是Python的 协程是在方法定义时就确定了,被定义协程的方法不能当做普通方法来使用,而Go语言中定义方法和协程调用是分开的,任意方法加上go 关键字都可以进行协程并发操作,实现了解耦合。

3、Go语言协程调度器

Go语言中所有的协程都通过调度器进行调度,大并发下成百上千甚至几千的协程调用 通过调度器安排到不同的线程中执行。

调度的切换

调度器会在何时的时间点进行协程之间的切换,通过切换可以将计算资源分配给其他协程而不至于被一个协程锁死资源,主要的切换点如下:

  • IO/SELECT
  • channel
  • 函数调用
  • runtime.Gosched()  手动切换
  • 等待锁

转载于:https://my.oschina.net/ruoli/blog/1816566

Go语言中协程的概念和基本使用相关推荐

  1. C语言中协程(coroutine)实现

    C语言协程库实现说明 代码实现 1. 当前支持的功能概览 1.1 创建任意数量协程并在协程中yield #include <stdio.h> #include <stdlib.h&g ...

  2. go 怎么等待所有的协程完成_GO语言基础进阶教程:Go语言的协程——Goroutine

    Go语言的协程--Goroutine 进程(Process),线程(Thread),协程(Coroutine,也叫轻量级线程) 进程进程是一个程序在一个数据集中的一次动态执行过程,可以简单理解为&qu ...

  3. 协程的概念,为什么要用协程,以及协程的使用

    什么是协程 协程, 我们又称为微线程,协程它不像线程和进程那样,需要进行系统内核上的上下文切换,协程的上下文切换是由开发人员决定的. 协程是一种用户级的轻量级线程.协程拥有自己的寄存器上下文和栈.协程 ...

  4. 细说协程零一、协程的概念

    序引:什么是进程和线程 直白地讲,进程就是应用程序的启动实例.比如我们运行一个游戏,打开一个软件,就是开启了一个进程. 进程拥有代码和打开的文件资源.数据资源.独立的内存空间. 线程又是什么呢?线程从 ...

  5. C语言关于协程的探究

    协程是一种用户级的轻量级线程,它可以在单线程里多个函数并发地执行协程,可以在主任务进行的同时,执行一些分支任务,以协助程序达到最终的效果,我们可以将协程成为用户态线程,但它与线程又有所区别. 协程和线 ...

  6. Go中协程间通信的方式Sync.Cond

    在Go中协程间通信的方式有多种,最常用的是channel.如果牵扯多个协程的通知,可以使用sync.Cond. 1. 程序中的通信方式 GO语言中有句名言:"不要用共享内存来通信,而是使用通 ...

  7. [通用技术]在不同语言中用协程实现全排列算法(C++/Lua/Python/C#)

    我这里实现全排列的基本算法如下(C++): 1 #include <algorithm> 2 #include <iostream> 3 #include <vector ...

  8. c语言主线程退出子线程,简单了解C语言中主线程退出对子线程的影响

    这篇文章主要介绍了简单了解C语言中主线程退出对子线程的影响,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 对于程序来说,如果主进程在子进程还未结束时 ...

  9. Kotlin中协程理解与实战(一)

    Kotlin中协程理解与实战(一) 什么是协程 在Android中协程用来解决什么问题 协程是: suspend -也称为挂起或暂停,用于暂停执行当前协程,并保存所有局部变量: resume -用于让 ...

最新文章

  1. 聚焦自动驾驶环境感知,AVVision Special Session (ICAS'21) 征稿开启
  2. 史上最大“云办公”实验开始,你参加了吗?
  3. python爬取音乐并保存_python3 实现爬取TOP500的音乐信息并存储到mongoDB数据库中
  4. struts教程笔记3
  5. 应用 Valgrind 发现 Linux 程序的内存问题
  6. c 语言车牌识别系统课题设计,基于图像的车牌识别系统的设计和实现
  7. python网络安全面试题_网络安全经典面试题(二)
  8. Python pyserial 串口工具
  9. inter uhd graphics630显卡驱动_极为全面的!从零开始的!小白都能看懂的!硬件科普#4 显卡选择篇...
  10. 他是清华大学唯一没学历教授,侵华日军都下令保护的大师级人物
  11. [简单]poi 创建word2007脚注(FootNote)
  12. 手机屏幕画面实时直播
  13. P5023 填数游戏
  14. csapp实验摘选 I Data Lab ——小小菜下士的第一篇博客
  15. 【今日CV 计算机视觉论文速览 第94期】 4 Apr 2019
  16. 追风筝的人 第八章
  17. Windows 11 移动文件夹错误 0x800700E1 无法成功完成操作
  18. 疫苗行业薪酬增长率在生物医药领域最为突出;华为发布全场景智能光储解决方案;开利完成对广东积微集团的收购 | 美通社头条...
  19. 区块链链上数据全公开,你却不知道怎么查?找Gikee啊
  20. c语言程序设计臧,C语言程序设计教学中计算思维培养.pdf

热门文章

  1. Eclipse、VBA、IE开发者工具 Debug快捷键
  2. 本地如何搭建FPT服务
  3. 关于cocos2d-x中CCScrollView和CCMenu触摸优先级的解决方案
  4. 安装mysql数据库及问题解决方法
  5. the import XXXX cannot be resolved 解决方法
  6. IIS7 应用程序池自动回收关闭的解决方案
  7. 前端后端分离,怎么解决SEO优化的问题呢?
  8. 记一次升级node版本后,运行原vue项目报错问题解决方法
  9. SpringBoot2.X + SpringCache + redis解决乱码问题
  10. Python vs Cpython