赖勇浩(http://laiyonghao.com)

协程,又称微线程和纤程等,据说源于 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. C++协程(三):Understanding the promise type

    本文翻译自c++协程库cppcoro库作者Lewis Baker的github post,本篇为第三篇,原文内容在https://lewissbaker.github.io/2018/09/05/un ...

  2. python协程详解_彻底搞懂python协程-第一篇(关键词1-4)

    任何复杂的概念或系统都不是凭空出现的,我们完全可以找到它的演化历程,寻根究底终会发现,其都是在一系列并不那么复杂的简单组件上发展演化而来! by 落花僧 本文通过一系列关键概念,逐步递进理解协程. 0 ...

  3. 事件驱动框架(三)——pt协程

    事件驱动框架(三)--pt协程 说明: 现在进入了框架整合的阶段,虽然当初的目标是以界面为主,但是项目中肯定还要加入一些其他操作.虽然可以沿用状态表的状态机方式来构建,但是为了整合整个框架,并且之前看 ...

  4. python协程三种实现方法

    协程的三种方法 1,协程中名词 event_loop 事件循环:程序开启一个无限的循环,程序员会把一些函数(协程)注册到事件循环上.当满足事件发生的时候,调用相应的协程函数. coroutine 协程 ...

  5. go语言之进阶篇主协程先退出导致子协程没来得及调用

    1.主协程先退出导致子协程没来得及调用 示例: package mainimport ("fmt""time" )//主协程退出了,其它子协程也要跟着退出 fu ...

  6. 王学岗Kotlin协程(三)---协程的上下文与协程的异常处理

    协程的上下文 我们使用构建器Launch去启动协程的时候,都需要指定协程上下文(没有显示指定会使用默认值). 协程上下文(CoroutineContext)是一组用于定义协程的行为元素.它由如下几项构 ...

  7. Tolua使用笔记三:Tolua协程用法

    案例5: 这一章讲的是lua中的协程 如果我没记错的话,lua中没有多线程,只有协程,lua的协程自带的用起来有点局限性,Tolua中协程由于重写了部分的方法,变得更加方便了 核心代码如下: func ...

  8. python3之协程(3)---greenlet实现协程操作

    原文链接:https://www.cnblogs.com/xybaby/p/6337944.html 正文 在前面的文章中提到python原生的generator是semicoroutine,而gre ...

  9. linux的进程/线程/协程系列5:协程的发展复兴与实现现状

    协程的发展复兴与实现现状 前言 本篇摘要: 1. 协同制的发展史 1.1 协同工作制的提出 1.2 自顶向下,无需协同 1.3 协同式思想的应用 2. 协程的复兴 2.1 高并发带来的问题 2.2 制 ...

最新文章

  1. java runnable main_Java 线程类问题写一个线程类MyThread,该线程实现了Runnable接口,写一个main方法, * 用for循...
  2. 使用CSS sprites减少HTTP请求
  3. matlab括号区别,matlab中各种括号(),[],与{}的区别与认识
  4. python导入同一文件夹下的类_Python模块导入机制与规范
  5. Shell脚本基础语法
  6. 电子科技大学计算机2019报名人数,电子科技大学录取分数线2019(在各省市录取数据)...
  7. 如何在XP SP2下面使用DTC
  8. 解决方案 -SQL脚本建表产生ORA-00942错误
  9. 锚点盒子随滚动条浮动
  10. leg引擎适合什么系统的服务器,第一讲 LEG引擎服务端更新BLUE引擎
  11. mysql phpmyadmin远程_phpMyAdmin远程连接mysql数据库
  12. web平台微信扫码登录
  13. FeedDemon 2.6.0.20 Final
  14. 仿支付宝实现密码框输入
  15. CMD命令行简单学习总结
  16. 多传感器融合定位五-点云地图构建及定位
  17. CSS、HTML补充
  18. Premiere视频片段剪辑、添加音乐、添加字幕
  19. 简单聊一下什么是大数据,hadoop和hdfs又是什么?
  20. 第98讲:使用SBT开发时动手解决rt.jar中CharSequence is broken等问题学习笔记

热门文章

  1. 我的矛盾—自我意识与精神内耗
  2. chrome备份导出书签
  3. 包教包会 | 十分钟教你用电子表格搭建一个仓库管理软件!
  4. 安卓开源项目周报0117
  5. VC6 向 VC9 移植时常见BUG
  6. 堆排序思想和案例图解
  7. Linux内核调度子系统之EAS
  8. Day2 Transparency and Trust in Human-AI-InteractionThe Role of Model-Agnostic Explanations in CV DSS
  9. 6篇干货带你学会用vue开发小程序——mpvue
  10. 小白学小程序需要的JavaScript知识点