博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
协程初探
阅读量:5735 次
发布时间:2019-06-18

本文共 1250 字,大约阅读时间需要 4 分钟。

文章出处:

 

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

转载地址:http://ihrwx.baihongyu.com/

你可能感兴趣的文章
在QT和SDL搭建的框架中使用OPENGL在SDL窗口上进行绘图
查看>>
REST技术第三步 @BeanParam的使用
查看>>
SharePoint 读取 Site Columns 的数据并绑定到DropdownList
查看>>
Python中的对象行为与特殊方法(二)类型检查与抽象基类
查看>>
使用 axios 详解
查看>>
通信基站(dfs回溯,思维)
查看>>
nginx web加密访问
查看>>
iOS - Regex 正则表达式
查看>>
第 68 章 Logical Volume Manager (LVM)
查看>>
膝盖中了一箭之康复篇-第八个月暨2月份目标总结
查看>>
IPA提交APPStore问题记录(一)
查看>>
有利于seo优化的网站地图不能取巧
查看>>
快照产品体验优化
查看>>
ASCII
查看>>
ibatis SqlMap not found
查看>>
Android SD卡创建文件和文件夹失败
查看>>
Ubuntu 14.04 vsftp refusing to run with writable root inside chroot问题解决方法
查看>>
Intellij IDEA远程调试tomcat
查看>>
hadoop的学习论坛
查看>>
Struts2 学习小结
查看>>