zoukankan      html  css  js  c++  java
  • 20170220-coroutine

    协程 coroutine

    最近频繁的听说到 “协程” 这个词,花了一段时间肤浅的研究了一下。对于 “它是一个什么东西” 有了一个大概的了解。

    from wiki
    Coroutines are computer program components that generalize subroutines for non-preemptive multitasking, by allowing multiple entry points for suspending and resuming execution at certain locations. Coroutines are well-suited for implementing more familiar program components such as cooperative tasks, exceptions, event loop, iterators, infinite lists and pipes.

    协程是一种为了实现非抢占式多任务的程序组件,它会有多个进入点,在这些进入点可以挂起休眠和恢复执行。协程非常适合用来实现我们常见的一些程序组件,例如协作式任务、异常、事件循环、迭代器、无限列表和管道。

    在我的理解中,协程本质上是一些程序的执行序列,它允许开发者使用它实现多任务协作完成某件事情。只是,与使用线程不同的是,在使用线程完成多任务开发时,会有多个线程分享 大专栏  20170220-coroutinecpu时间、在线程切换的时候会有上下文相关的操作,而且,在线程之间需要加锁来处理线程的竞态问题。
    反观协程,自始至终只有一个协程存在,就算有其他协程也是出于休眠状态。协程在执行完一部分程序之后,可以切换到另外一个协程执行程序,而这个切换非常的轻量级。协程只能主动放弃执行把执行权给指定的协程,而不能被抢占,因此它是一个非抢占式的。这样意味着,有别于线程的是,协程的执行顺序是完全已知的并且可控的。

    线程是操作系统的一个概念,而协程是基于程序语言实现的特性,因此是用户态的。因此,实际上,协程是一种用户态的线程,相当于你在现有程序语言的基础上,自己开发一套,实现程序的调度。

    前面也说到,既然是切换,程序执行的状态需要记录下来,协程在实现的时候需要一块特殊的内存地址范围存放信息,c语言中有类似的机制setjump/longjump和ucontext。太过于底层,可以在参考文献中查看。

    以上仅仅是我自己的理解

  • 相关阅读:
    (HDU)1097 --A hard puzzle(难题)
    (HDU)1096 --A+B for Input-Output Practice (VIII)(输入输出练习(VIII))
    PAT B1008——数组元素循环右移
    test
    vue iconfont矢量图
    css3简单旋转
    vue 路由的安装及使用
    vue 父组件与子组件之间的相互调用
    vue 脚手架安装
    PHP 加密方式
  • 原文地址:https://www.cnblogs.com/lijianming180/p/12261148.html
Copyright © 2011-2022 走看看