说一说golang的协程

发布时间:2021-12-05 01:43:33

协程是应用层的线程。




应用层是相对于内核层而言,是操作系统的概念,对应的是cpu的运行级别。操作系统的核心代码运行的ring0级别,应用程序的代码运行在ring3级别。内核与应用层的级别设置保证了一些高权限的操作只有内核代码能做,应用程序要使用这些功能必须通过调用操作系统的API(linux上称为系统调用)来调用内核的代码。这个调用会导致cpu从ring3到ring0的上下文切换,这个切换是耗费一些cpu时间的。




线程是操作系统的内核对象,多线程编程时,如果线程数过多,就会导致频繁的上下文切换,这些cpu时间是一个额外的耗费。所以在一些高并发的网络服务器编程中,使用一个线程服务一个socket连接是很不明智的。于是操作系统提供了基于事件模式的异步编程模型。用少量的线程来服务大量的网络连接和I/O操作。但是采用异步和基于事件的编程模型,复杂化了程序代码的编写,非常容易出错。因为线程穿插,也提高排查错误的难度。




协程,是在应用层模拟的线程,他避免了上下文切换的额外耗费,兼顾了多线程的优点。简化了高并发程序的复杂度。举个例子,一个高并发的网络服务器,每一个socket连接进来,服务器用一个协程来对他进行服务。代码非常清晰。而且兼顾了性能。




那么,协程是怎么实现的呢?


他和线程的原理是一样的,当a线程切换到b线程的时候,需要将a线程的相关执行进度压入栈,然后将b线程的执行进度出栈,进入b的执行序列。协程只不过是在应用成实现这一点。


但是,协程并不是有操作系统调度的,而且应用程序也没有能力和权限执行cpu调度。怎么解决这个问题?


答案是,协程是基于线程的。内部实现上,维护了一组数据结构和n个线程,真正的执行还是线程,协程执行的代码被扔进一个待执行队列中,有这n个线程从队列中拉出来执行。这就解决了协程的执行问题。那么协程是怎么切换的呢?答案是:golang对各种io函数进行了封装,这些封装的函数提供给应用程序使用,而其内部调用了操作系统的异步io函数,当这些异步函数返回busy或bloking时,golang利用这个时机将现有的执行序列压栈,让线程去拉另外一个协程的代码来执行,基本原理就是这样,利用并封装了操作系统的异步函数。包括linux的epoll,select和windows的iocp,event等。




由于golang是从编译器和语言基础库多个层面对协程做了实现,所以,golang的协程是目前各类有协程概念的语言中实现的最完整和成熟的。


十万个协程同时运行也毫无压力。关键我们不会这么写代码。但是总体而言,程序员可以在编写golang的代码是,可以更多的关注业务逻辑的实现,更少的在这些关键的基础构件上耗费太多精力。







相关文档

  • 葡萄干马芬蛋糕的家常做法
  • 卜伯的故事
  • 颈椎病的自我锻炼方法
  • 微信面对面支付过钱以后想加对方好友怎么才能加上
  • tt桌球瞄准器手机版_HoloLens版IVAS战斗力:轻松击中300码开外目标
  • 电脑重启的快捷键是什么样的
  • 《游戏公平》教学反思范文
  • 那一次,我读懂了离别的伤悲
  • 父亲节高中作文800字范文5篇
  • 锡纸正反面的使用方法锡纸正反面怎么区分
  • 西瓜皮别扔,拿来沤肥,好用不花钱!
  • 菲洛嘉面霜保质期多久开封后6个月内使用完毕
  • 什么是DevCloud?
  • IIS6.0漏洞之CVE-2017-7269 远程代码执行漏洞复现及Poc验证
  • 给朋友的光棍节祝福语短信共2篇
  • 苹果手机设置里面怎么变黑了
  • 新高一学习方法:高一新生应从五方面制定学习计划
  • 天成元牌维生素c咀嚼片怎么样?效果好吗?
  • 清明浙江自驾游路线
  • 解除宿醉13种方法
  • 女人肥胖的原因有哪些
  • 公司廉政协议
  • 360安全卫士怎么设置摄像头防偷窥功能
  • 保育老师心得体会
  • 感恩教师节名言警句
  • 江南应天府现在是什么地方
  • 报考公务员都需要哪些条件
  • C语言之停车场管理系统
  • 护理管理学习心得范文3篇
  • 干部关系介绍信样本
  • 猜你喜欢

  • ××局机关党支部转段的报告
  • 电力职工述职述廉与电力营业员工作总结汇编.doc
  • 母亲节快乐作文300字_高中高二作文_0
  • 2018-2019年温州市水心小学三年级上册科学模拟期末考试无答案(1)
  • 贾府母亲七十答谢词
  • 【18套试卷合集】山东省菏泽牡丹区六校联考2019年中考化学四月一模拟试卷
  • 必修4 动词-ing形式作表语、定语、宾语补足语和状语同步练*
  • 立体烫金工艺和设备要求
  • 工业机器人校外实训基地设备采购项目用户需求书
  • 导致怀孕空囊的原因
  • 网上英语角初中英语作文
  • 人教版初中英语语法大全修订
  • 北京有啥好吃的栗子店
  • 婚前买房后面没结婚怎么办
  • 深度学习和强化学习的关系
  • 程序员简历经验
  • 威远云峰农业科技园(企业信用报告)- 天眼查
  • 浅析起重机电气控制系统的设计
  • 上海水仙进出口有限公司(企业信用报告)- 天眼查
  • 旅游*台介绍
  • 孕妇喝羊奶有什么好处
  • 爱祖国、爱家乡
  • 2019年最新3月预备党员思想汇报:人生价值观对人的导向作用思想汇报文档【五篇】
  • JS电能计量装置接线检查
  • 国家文物局关于湖北省博物馆赴香港参加“孙中山纪念馆文物展览”的批复
  • 一年级下册英语课件-Unit 2 Room Lesson 1 人教(新起点)(2018秋) (共15张PPT)
  • 四年级叙事作文:幽默风趣的家_400字
  • 消费者协会履行消协20XX瑟肽旯ぷ髯芙岘总结报告模板
  • 济南市长清区平安农村信用合作社王宿分社企业信息报告-天眼查
  • 最新一年级下册语文看拼音写汉字
  • 辽宁省卫生计生委办公室关于印发2016年辽宁省基层卫生人员培训项
  • 班组长培训(第1天)
  • 寒假学校实践活动总结
  • 2017-2018年高考生物 专题三 细胞代谢 考点2 酶在代谢中的作用
  • 我的老师_小学四年级作文800字
  • 三维气固两相混合层湍流拟序结构的直接数值模拟
  • 论文阅读与思考(1):Heterogeneous Graph Attention Network异构图注意力网络
  • 珠海金典网络科技有限公司企业信用报告-天眼查
  • 2008中国大学教育学本科A
  • 旅游景区产品营销创新策略
  • 2018-2019学年七年级英语上册 Unit 1 School and Friends单元基础回眸练* (新版)冀教版
  • 中考一日三餐怎么吃
  • 电脑版