协程,又称微线程和纤程等,据说源于 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 实现了跨平台的用户空间线程,即协程的另一种别称。在这百花齐放的时节,正是我们好好学习和利用它的时机。

接下来我将在第二篇中谈谈游戏中试用协程的三个场合。

协程,又称微线程和纤程相关推荐

  1. python 之 ------- 协程(微线程)

    协程 文章目录 概念 : 优点 : 缺点 : 特点 : yield的实现 greenlet模块 gevent模块 概念 : 是单线程下的并发,又称微线程,纤程.英文名Coroutine. 简单的解释: ...

  2. 进程、线程、纤程、协程

    进程.线程.纤程.协程的区别 进程:进程 是 OS 分配资源的基本单位.一个进程对应一个端口号, OS 会为每一个进程 独立分配一部分资源.通常我们每运行一次程序,都会产生一个进程. 线程:是 CPU ...

  3. Java程序员需要掌握的计算机底层知识(三):进程、线程、纤程、中断

    面试高频问题 问:进程和线程有什么区别? 答:进程是一个程序运行起来的状态(运行态),线程是一个进程中不同的执行路径(线程只是其中一个). 更为专业的回答:进程是操作系统用来分配资源的基本单位,线程是 ...

  4. 进程、线程、纤程的区别

    相信很多童鞋在面试的时候,面试官都会提这样的一个问题. 请你说说什么是进程,什么是线程,两者有什么区别? 很多童鞋遇到这样的提问可能会这样回答,进程就是一个程序运行起来的状态,而线程是一个进程中不同的 ...

  5. python多线程调用携程,进程、线程和携程的通俗解释【刘新宇Python】

    通过下面这张图你就能看清楚了,进程.线程和携程的关系 多个进程是可以运行在多个CPU当中的,比如你的电脑是4核,可以同时并行运行四个进程,这是真正物理上的并行运行. 每个进程又可以有多个线程,线程是轮 ...

  6. nodejs中的fiber(纤程)库详解

    fiber/纤程 在操作系统中,除了进程和线程外,还有一种较少应用的纤程(fiber,也叫协程).纤程常常拿来跟线程做对比,对于操作系统而言,它们都是较轻量级的运行态.通常认为纤程比线程更为轻量,开销 ...

  7. 深入并发线程、进程、纤程、协程、管程与死锁、活锁、锁饥饿详解

    一.进程.线程.纤程.协程.管程概念理解 在现在你可能会经常看到进程.线程.纤程.协程.管程.微线程.绿色线程....一大堆xx程的概念,其实这些本质上都是为了满足并行执行.异步执行而出现的一些概念. ...

  8. 进程 线程 协程_进程 线程 协程 管程 纤程 概念对比理解

    不知道是不是我自己本身就有那么一丝丝的密集恐惧,把这么一大堆看起来很相似很相关的概念放在一起,看起来是有点麻,捋一捋感觉舒服多了. 相关概念 任务.作业(Job,Task,Schedule) 在进程的 ...

  9. Windows 纤程/协程

    Windows下 纤程/协程 理论知识,立足根本 使用须知 代码 写这篇文章的原因是,很多框架/库都有协程/纤程的支持,比如python的gevent,PHP 的swoole等等,但是具体是什么样的呢 ...

最新文章

  1. 本周ASP.NET英文技术文章推荐[03/11 - 03/17]
  2. 在/proc/devices中只能看见一个,请问是什么原因
  3. Spring Security 入门(四):自定义-Filter
  4. 给thinkphp加个分页样式
  5. n分解后的最大乘积java_【编程题】乘积最大的拆分
  6. python 自动回收机制
  7. SVN+MAVEN项目打包
  8. 递归算法及经典递归例子代码实现
  9. oracle登录卡,【Oracle连接问题】关于windows xp3上oracle连接登录卡住的问题
  10. 【产品】业务流程+任务流程+页面流程绘制指南
  11. 《一个会写诗的程序员》 东海光剑
  12. “启用宏的幻灯片”是什么意思
  13. 上海还有哪些比较好的IB学校?
  14. 什么是网站被黑,如何处理网站被黑?
  15. python语言开发什么_python语言是什么语言开发的_Python语言的由来,编程语言简史...
  16. 这个应该是目前最全的Tracking相关的文章了
  17. element适配svg格式图片
  18. win10系统开启局域网共享
  19. Salesforce系列(六):Salesforce Apex基础SOQL查询和数据添加!
  20. Generative Adversarial Networks(WGAN、SAGAN、BigGAN)

热门文章

  1. golang 定义一个空切片_Golang简单入门教程——函数进阶使用
  2. 往有序链表的插入元素使原链表依旧有序
  3. 【数学与算法】曲线上各点的曲率kappa和倾角theta
  4. JavaScript 函数定义方式
  5. 论面向组合子程序设计方法 之 oracle
  6. Java HashMap 核心源码解读
  7. chrome调试工具常用功能整理
  8. MVC框架浅析(基于PHP)
  9. 第六章 深度学习(上)
  10. java中的深浅克隆