Table of Contents

协程简介

协程Libco库

libco的特性

PS:CGI框架

PS:Lambda表达式


协程简介


协程这个概念其实在《操作系统》系统里面应该有了解过,进程(process),线程(thread),协程(routinue),其中大部分博客,论文对进程和线程都有介绍,协程的介绍却比较少。协程其实是在线程里面跑的,比线程更细粒度。线程里面其实是有当前执行的上下文信息,里面装了当前执行的位置,将要执行什么代码。如果我们有多个这样的上下文,并且可以在里面各种跳转,就类似于我们在线程里面实现了一种更细粒度的“线程”。你可以把这种上下文理解成一个函数,相当于有A,B两个函数,我在执行A的时候,还没执行完,然后暂停了一下,去执行B,然后还没等B执行完,又暂停一下,去继续执行A,就像线程调度一样,但这个不是线程,因为A和B不能并发(有些框架其实是可以的,例如,在上一家公司用的一个叫BRPC的框架,后面我会写博客介绍这个框架,这里的协程就是指在一个线程里面的那种协程),也就是A执行的时候,B不能执行,B执行的时候,A不能执行,所以这种协程不用考虑锁的问题,因为不会发生竞争。另外和线程不同的是,这种协程调度不是由操作系统来调度的,是由开发者,也就是人通过代码来调度的。线程是操作系统执行的最小单位,对于操作系统来说,他只能看到线程,不知道这个线程里面是怎么调度的。这是这种“子程序”或者“运行模式”(我也不知道用什么名词比较合适)就是协程。

那么协程的优势在哪儿呢,看起来协程并不能并发,似乎用处不大。但回想一下我们在一些耗时操作的时候,例如网络请求,有段时间我们会等待请求回来,这种等待其实就是一种CPU资源的浪费。这时候如果有协程,我们在知道要等待的时候,在代码里面切换一下,去执行其他操作,等那个请求回来了,我们再切回去执行那个返回的结果,这样不就把等待那部分时间给利用起来了么。如果是在多线程里面,一个线程的请求没回来,我们可能用一个thread_yield,或者wait的方法,让这个线程休眠,但这样中间就会有一次线程切换,会浪费一些消耗,而协程切换就不会有这个影响,因为在操作系统看来,这全部都是在一个线程里面去完成的。所以这也是协程的最大的优势:协程切换开销远小于线程,进程切换

协程Libco库

https://github.com/Tencent/libco


Libco是ac / c ++协程库,在微信服务中广泛使用。自2013年以来,它已在成千上万的计算机上运行。

通过与libco链接,您可以轻松地将同步后端服务转换为协程服务。与多线程方法相比,协程服务将提供出色的并发性。使用系统挂钩,您可以轻松地以同步方式进行编码,但可以异步执行。

您还可以使用co_create / co_resume / co_yield接口创建异步后端服务。这些界面将使您更好地控制协程。

通过libco复制堆栈模式,您可以轻松地建立支持数千万tcp连接的后端服务。

作者:sunnyxu(sunnyxu@tencent.com),leiffyli(leiffyli@tencent.com),dengoswei@gmail.com(dengoswei@tencent.com),sarlmolchen(sarlmolchen@tencent.com)

libco的特性


  • 消除不必要的业务逻辑,把多进程,多线程服务改造成协程服务,并发能力得到百倍提升;
  • 支持CGI框架,轻松构建web服务(新);
  • 支持gethostbyname,mysqlclient,ssl等常用第三库(新);
  • 可选的共享栈模式,单机轻松加入千万连接(新);
  • 完善简洁的协程编程接口
  • 类pthread接口设计,通过co_create,co_resume等简单清晰的接口即可完成协程的创建与恢复;
  • __thread的协程私有变量,协程间通信的协程信号量co_signal(新);
  • 语言等级的lambda实现,结合协程原地编写并执行后台初始化任务(新);
  • 基于epoll / kqueue实现的小而轻的网络框架,基于时间轮盘实现的高性能定时器;

PS:CGI框架

CGI,一言以蔽之——协议。为了和普通的网络协议做区分,我们可以称之为接口协议。所谓协议就是各方约定,达成共识的一种规则。比如中国公路靠右行驶,这就是公路的协议。网络协议约定的是逐字节的含义,大家遵守,就能方便解析,理解。CGI约定的不是逐字节的语义,而是一个个kv(不完全是kv,但可以大概这么理解)。用一个不太恰当的比喻来形容,网络协议描述的单位是数组,而CGI接口协议描述的是map。CGI是比较原始的开发动态网站的方式。

CGI,SWGI区别

cgi通过环境变量,输入输出流完成web server与处理逻辑的http协议的交互,由于是基于流方式,所以各种语言都可以写cgi程序。wsgi是将web server参数python化,封装为request对象传递给apllication命名的func对象并接受其传出的response参数,由于其处理了参数封装和结果解析,才有python世界web框架的泛滥,在python下,写web框架就像喝水一样简单:)

PS:Lambda表达式

Lambda 表达式(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数。Lambda表达式可以表示闭包(注意和数学传统意义上的不同)。

Libco是一个C/C++协程库,在微信服务中广泛使用相关推荐

  1. 协程的原理及协程在高并发服务中的应用

    协程的原理 协程(coroutine)跟具有操作系统概念的线程不一样,实际上协程就是类函数一样的程序组件,你可以在一个线程里面轻松创建数十万个协程,就像数十万次函数调用一样.只不过函数只有一个调用入口 ...

  2. isql 测试mysql连接_[libco] 协程库学习,测试连接 mysql

    历史原因,一直使用 libev 作为服务底层:异步框架虽然性能比较高,但新人学习和使用门槛非常高,而且串行的逻辑被打散为状态机,这也会严重影响生产效率. 用同步方式实现异步功能,既保证了异步性能优势, ...

  3. libco协程库上下文切换原理详解

    缘起 libco 协程库在单个线程中实现了多个协程的创建和切换.按照我们通常的编程思路,单个线程中的程序执行流程通常是顺序的,调用函数同样也是 "调用--返回",每次都是从函数的入 ...

  4. ucontext-人人都可以实现的简单协程库

    1.干货写在前面 协程是一种用户态的轻量级线程.本篇主要研究协程的C/C++的实现. 首先我们可以看看有哪些语言已经具备协程语义: 比较重量级的有C#.erlang.golang* 轻量级有pytho ...

  5. linux c++11高性能协程库netco

    目录 一.开源协程库调研 1.golang语言自带协程 2.云风的coroutine协程库 3.腾讯的libco协程库 4.魅族的libgo协程库 二.netco协程库概述 三.netco的实现 1. ...

  6. C/C++协程库libco:微信怎样漂亮地完成异步化改造

    如今,微信拥有月活跃用户8亿. 不可否认,当今的微信后台拥有着强大的并发能力. 不过, 正如罗马并非一日建成:微信的技术也曾经略显稚嫩. 微信诞生于2011年1月,当年用户规模为0.1亿左右:2013 ...

  7. libco协程库源码解读

    2019独角兽企业重金招聘Python工程师标准>>> 协程,又被称为用户级线程,是在应用层被调度,可以减少因为调用系统调用而阻塞的线程切换的时间.目前有很多协程的实现,由于微信内部 ...

  8. C++ 开源协程库 libco——原理及应用

    1 导论 使用 C++ 来编写高性能的网络服务器程序,从来都不是件很容易的事情.在没有应用任何网络框架,从 epoll/kqueue 直接码起的时候尤其如此.即便使用 libevent, libev这 ...

  9. 微信 libco 协程库原理剖析

    作者:alexzmzheng 同 Go 语言一样,libco 也是提供了同步风格编程模式,同时还能保证系统的高并发能力,本文主要剖析 libco 中的协程原理. 简介 libco 是微信后台大规模使用 ...

最新文章

  1. 【UIKit】UITableView 自定义Cell2
  2. MySQL优化系列(二)--查找优化(1)(非索引设计)
  3. java冒泡排序_Java算法分析之冒泡排序(Bubble Sort)
  4. TIOBE 8 月榜单:Groovy 和 Objective-C 重返前二十
  5. python学成需要多久-小白学python怎么快速入门?多久能完成一个项目?
  6. 现代密码学3.7--CCA安全
  7. java 雪花特效_java实现图片飘雪花的特效
  8. __declspec(dllimport)
  9. 洛谷——P1068 分数线划定
  10. 《精彩绝伦的CSS》读书笔记(二)
  11. Spring WebFlux 响应式编程学习笔记(一)
  12. a==b和a.equals(b)的区别
  13. 票据打印, 账单打印, 标签打印, 文档打印, 条码打印, 批量打印, 包装纸打印与设计,可变数据打印打印,发布,VC++源代码组件库解决方案...
  14. ubuntu 更改语言桌面_让 Ubuntu 滚动更新
  15. C++设计模式之Template Method(模板方法模式)
  16. UML2.0详细教程(附示例)
  17. Anaconda下载(Windows系统)
  18. ios订阅其他国家节假日日历
  19. 如何清理roaming_笔记本电脑中appdata中roaming怎么越来越大该怎么办
  20. 计算机网络线接法,电脑网线插座接法图文详解

热门文章

  1. Wireshark抓包工具使用
  2. 介绍一下Python中webbrowser的用法?
  3. Python中 '==' 与'is' 以及它们背后的故事
  4. js和jQuery判断数组是否包含指定元素
  5. 微信小程序Server端环境配置
  6. PHP set_error_handler()函数的使用【转载】
  7. 《教孩子编程(Python语言版)》课程介绍
  8. 3-3-ServletContext接口
  9. scp传服务器文件,使用tar、scp和screen在服务器之间传输文件
  10. nuxt服务端php,nuxt服务端部署上线