关于协程的初步理解

转载 2016年08月31日 14:00:58

参考 http://blog.csdn.net/gzlaiyonghao/article/details/5397038

协程,又称微线程和纤程等,据说源于 Simula 和 Modula-2 语言(我没有深究,有错请指正),现代编程语言基本上都有支持,比如 Lua、ruby 和最新的 Google Go,当然也还有最近很让我惊艳的 falcon。协程是用户空间线程,操作系统其存在一无所知,所以需要用户自己去做调度,用来执行协作式多任务非常合适。其实用协程来做的东西,用线程或进程通常也是一样可以做的,但往往多了许多加锁和通信的操作。

 

下面是生产者消费者模型的基于抢占式多线程编程实现(伪代码):
// 队列容器
var q := new queue
// 消费者线程
loop
  lock(q)
  get item from q
  unlock(q)
  if item
    use this item
  else
    sleep 
// 生产者线程
loop
  create some new items
  lock(q)
  add the items to q
  unlock(q)

 

由以上代码可以看到线程实现至少有两点硬伤:

 

1、对队列的操作需要有显式/隐式(使用线程安全的队列)的加锁操作。

 

2、消费者线程还要通过 sleep 把 CPU 资源适时地“谦让”给生产者线程使用,其中的适时是多久,基本上只能静态地使用经验值,效果往往不由人意。

 

而使用协程可以比较好的解决这个问题,下面来看一下基于协程的生产者消费者模型实现(伪代码):
// 队列容器
var q := new queue
// 生产者协程
loop
 
while q is not full
    create some new items
    add the items to q
  yield to consume
// 消费者协程
loop
  while q is not empty
    remove some items from q
    use the items
  yield to produce

 

可以从以上代码看到之前的加锁和谦让 CPU 的硬伤不复存在,但也损失了利用多核 CPU 的能力。所以选择线程还是协程,就要看应用场合了。下面简单谈一下协程常见的用武之地,其中之一是状态机,能够产生更高可读性的代码;还有就是并行的角色模型,这在游戏开发中比较常见;以及产生器, 有助于对输入/输出和数据结构的通用遍历。

 

协程虽然如此之好,看是很长时间以来,因为受到基于堆栈的子例程实现的限制,并没有多少语言在其实语言或库中支持协程,所以线程作为一个替代者(当然,线程也有其超越协程之处)被广泛接受了。但是在今天,很多语言都内建了协程的支持,甚至是 C/C++ 语言。MS Windows 2000 以后的版本,都支持所谓的 Fiber,即纤程,其实就是协程的别称;在开源平台,POSIX 标准也定义了协程相关的标准,GNU Portable Threads 实现了跨平台的用户空间线程,即协程的另一种别称。在这百花齐放的时节,正是我们好好学习和利用它的时机。

个人对于协程的理解

有人问我协程是什么?很久以前了解过,但一直没用到,概念就忘了,最近又好好看了看协程的概念,做个记录。 首先,我觉得网上很多人把协程和线程一起比较是很让人混淆的,线程和进程都是操作系统级别的概念,协程...
  • taizitj
  • taizitj
  • 2016年12月13日 14:02
  • 280

协程(一)快速理解协程的定义和分类

协程的概念很早以前就被提出,很多语言也实现了协程,例如Erlang,Lua。不过我首次接触协程是在学习golang的过程中,当真正使用协程的时候就被它的优雅和高效所折服,这也埋下了自己对协程好奇的种子...
  • u010599509
  • u010599509
  • 2016年08月19日 15:22
  • 1902

Kotlin的协程理解

       1. 协程,微线程,纤程。英文名Coroutine。 2. 协程不是进程也不是线程,它的执行过程更类似于子例程。或者说不带返回值的函数调用。 3. 一个程序中可以包含多个协...
  • qq_21700489
  • qq_21700489
  • 2018年02月07日 10:21
  • 28

go语言协程认识-1

//关于go语言协程通道的使用 //1.通道可以带缓存,也可以不带 //2.不带缓存的,不管是读还是写都会阻塞 //3.带缓存的,如果缓存溢出,就会阻塞 //4.make(chan int,1)和ma...
  • davidsu33
  • davidsu33
  • 2016年10月20日 09:35
  • 741

协程学习:基本概念(一)

协程的定义 根据维基百科的描述,协程是一种程序组件,与子例程一样,但是协程更为一般和灵活,但在实践中使用没有子例程那样广泛。 https://zh.wikipedia.org/wiki/%E5%8...
  • houzhuoming1
  • houzhuoming1
  • 2016年10月11日 21:14
  • 547

unity3d 协程的初步理解

能告诉我什么是协程吗? 协程的官方定义是一种具有暂停执行并将控制权返回给Unity,待下一帧时继续执行。通俗点讲就是,协程是一种可以分部执行的函数,即该函数不是每次调用时都会执行函数体内的全部方法,...
  • ycl295644
  • ycl295644
  • 2015年08月03日 14:07
  • 1754

Python中协程的理解

Num01–>协程的定义 协程,又称微线程,纤程。英文名Coroutine。 首先我们得知道协程是啥?协程其实可以认为是比线程更小的执行单元。 为啥说他是一个执行单元,因为他自带CPU上下文...
  • u014745194
  • u014745194
  • 2017年05月11日 18:08
  • 1269

浅谈我对协程的理解

最近在研究网络服务框架方面的东西,发现了一个神奇的东西-协程。 一句话说明什么是线程:协程是一种用户态的轻量级线程。 一句话并不能完全概括协程的全部,但是起码能让我们对协程这个概念有一个基本的印象。...
  • qq910894904
  • qq910894904
  • 2014年12月03日 17:09
  • 50760

Unity3D协程介绍 以及 使用

作者ChevyRay ,2013年9月28日,snaker7译  原文地址:http://unitypatterns.com/introduction-to-coroutines/ 在U...
  • huang9012
  • huang9012
  • 2014年08月11日 15:09
  • 83352

PHP协程实现过程详解

实现 PHP 协程需要了解的基本内容。 多进程/线程 最早的服务器端程序都是通过多进程、多线程来解决并发IO的问题。进程模型出现的最早,从Unix 系统诞生就开始有了进程的概念。最早的服务...
  • cs729298
  • cs729298
  • 2017年06月08日 11:52
  • 777
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于协程的初步理解
举报原因:
原因补充:

(最多只允许输入30个字)