Coroutine(协程)模式与线程
概念
协程(Coroutine)这个概念最早是Melvin Conway在1963年提出的,是并发运算中的概念,指两个子过程通过相互协作完成某个任务,用它可以实现协作式多任务,协程(coroutine)技术本质上是一种程序控制机制。比如,消费者/生产者,你走几步,我走几步;下棋对弈,你一步我一步。
Coroutine(协程)可以分为:
- 非对称式(asymmetric)协程,或称半对称式(semi-asymmetric)协程,又或干脆就叫半协程(semi-coroutine)
- 对称式(symmetric)协程。
非对称式(asymmetric)协程之所以被称为非对称的,是因为它提供两种传递程序控制权的操作:一种是重调用协程,另一种是挂起协程,并将程序控制权返还给调用者。
而对称式协程的特点是只有一种传递程序控制权的协程,即将控制权传递给指定的协程。
线程和协程的异同
协程(Coroutine)类似于线程(Thread)的地方是:每个协程都有有自己的堆栈,自己的局部变量。
线程和协程的主要区别在于:
1. 线程可以并发运行,线程之间是不能共写全局变量(写冲突)。
2. 协程不能并发运行,协程之间可以共享全局变量(不会存在写冲突)。
协程的状态
协程有三种状态:挂起(suspended),运行(running),停止(dead)。
当我们创建一个协程时他开始的状态为挂起态,也就是说我们创建协程的时候不会自动运行。
激活协程
激活挂起的协程,使协程继续运行。参数co是一个协程对象。
如果协程是挂起状态,则继续运行,resume函数返回true。如果协程已经停止或者遇到其他错误,resume函数返回false。
挂起协程
挂起当前协程。直到协程被外部协程使用CoRoutine.Resume再次激活,将返回到执行CoRoutine.Yield函数后的地方继续执行。
CoRoutine.yield的参数将传递给SaveYieldedValue虚方法,你需要重载该方法处理。
当一个协程正在运行时,不能在外部终止它.只能在协程内部调用coroutine.yield挂起当前协程。
不需要考虑协程安全、协程同步的问题。协程的代码比线程的代码更容易编写。
“控制”和“行为”的复用
在很多时候,我们需要对数据结构(如:List,Stack)中的元素按某种要求进行遍历,我们称之为“控制”;然后对目标元素进行某个操作(如,显示该元素),我们称之为“行为”。许多情况下,这种“控制”或行为的代码本来是可以被复用的,但是因为难以将这其中的“控制”和“行为”分离,造成了我们不得不一遍又一遍的书写这些类似的代码(虽然利用回调可以实现在一定程度上的“控制”和行为的分离,但是并不优雅,也不无法实现彻底重用)。举例来说就像是典型的生产者消费者模型。
Coroutine(协程)模式与线程的更多相关文章
- Kotlin Coroutine(协程): 三、了解协程
@ 目录 前言 一.协程上下文 1.调度器 2.给协程起名 3.局部变量 二.启动模式 CoroutineStart 三.异常处理 1.异常测试 2.CoroutineExceptionHandler ...
- Swoole 同步模式与协程模式的对比
在现代化 PHP 高级开发中,Swoole 为 PHP 带来了更多可能,如:常驻内存.协程,关于传统的 Apache/FPM 模式与常驻内存模式(同步)的巨大差异,之前我做过测试,大家能直观的感受到性 ...
- Kotlin Coroutine(协程): 二、初识协程
@ 目录 前言 一.初识协程 1.runBlocking: 阻塞协程 2.launch: 创建协程 3.Job 4.coroutineScope 5.协程取消 6.协程超时 7.async 并行任务 ...
- Kotlin Coroutine(协程): 一、样例
@ 目录 前言 一.直接上例子 1.延时任务. 2.异步任务 3.并行任务: 4.定时任务: 总结 前言 你还在用 Hanlder + Message? 或者 AsyncTask? 你还在用 Rxja ...
- 关于协程的学习 & 线程栈默认10M
先看的这篇文章:http://blog.csdn.net/qq910894904/article/details/41699541 以nginx为代表的事件驱动的异步server正在横扫天下,那么事件 ...
- 什么是协程?与线程和进程对比优劣在哪?gevent协程示例代码
协程 协程,又称微线程,纤程.英文名Coroutine..一句话说明什么是线程:协程是一种用户态的轻量级线程. 协程拥有自己的寄存器上下文和栈.协程调度切换时,将寄存器上下文和栈保存到其他地方,在 ...
- coroutine协程
如果你接触过lua这种小巧的脚本语言,你就会经常接触到一个叫做协程的神奇概念.大多数脚本语言都有对协程不同程度的支持.但是大多编译语言,如C/C++,根本就不知道这样的东西存在.当然也很多人研究如何在 ...
- [Unity-22] Coroutine协程浅析
1.概念解释 协程并非一个独立的线程.在Unity中.全部的语句都是在一个线程中运行的,也就是说.Unity是单线程的(详细的能够參见http://blog.csdn.net/alexander_xf ...
- 利用swoole coroutine协程实现redis异步操作
<?php #注意:如果不开启兼容模式,会遇到这样的现象,用swoole协程的方法访问常规方法添加到redis中的数据,可能访问不到(直接返回NULL)!这可能是两者采用了不同的技术标准所致! ...
随机推荐
- SpringBoot 版本升级后报错 Cannot instantiate interface org.springframework.context.ApplicationContextInitializer
本篇博客纯粹讲我遇到这个问题的解决以及思考,如果你想知道解决方法,可以直接看正确解决方案部分.因为是前端写的,所以可能有些明显的内容很容易就看出来了. 首先:升级后更新其他依赖,以及Applicati ...
- P2762 [网络流24题]太空飞行计划问题(最小割)
地址 最大权闭合子图裸题,不说了吧,求方案就是把s集遍历一遍. 错误记录:dfs那块忘判断残量了,11分×1. #include<cstdio> #include<iostream& ...
- C# Unit Test 备注
1. UT工程的编译一定要让依赖的dll在同一目录,即和测试目标dll运行的环境一样. 比如 Demo-UT测试Demo工程, 则Demo工程依赖的所有dll必须和Demo输出的可执行环境Demo.d ...
- 13 vue学习 package.json
一:package.json文件详解 管理你本地安装的npm包 .定义了这个项目所需要的各种模块,以及项目的配置信息(比如名称.版本.许可证等元数据).npm install命令根据这个配置文件,自动 ...
- Docker入门(六):Stacks
这个<Docker入门系列>文档,是根据Docker官网(https://docs.docker.com)的帮助文档大致翻译而成.主要是作为个人学习记录.有错误的地方,Robin欢迎大家指 ...
- Oracle数据去重
一.完全重复数据去重方法 具体思路是,首先创建一个临时表,然后将DISTINCT之后的表数据插入到这个临时表中;然后清空原表数据;再讲临时表中的数据插入到原表中;最后删除临时表. 对于表中完全重 ...
- CodeForces 489C Given Length and Sum of Digits... (dfs)
C. Given Length and Sum of Digits... time limit per test 1 second memory limit per test 256 megabyte ...
- C# 写 LeetCode easy #9 Palindrome Number
9.Palindrome Number Determine whether an integer is a palindrome. An integer is a palindrome when it ...
- 苦逼三流小公司程序员这半年找工作经历(3)——选择offer
本文按照企业规模.性质.规模,分成三类,点评一下遇到的这些公司.也算是为半年找工作经历的一个总结. 1,三流小公司 公司规模类似于笔者跳槽前所在企业,性质有外商独资.合资,当然大多数都是民营企业,规模 ...
- ue4学习资料
官网中文 https://docs.unrealengine.com/latest/CHN/index.html 官网英文 https://docs.unrealengine.com/latest/I ...