资讯专栏INFORMATION COLUMN

【node学习】协程

UCloud / 682人阅读

摘要:协程要理解就必须知道一个概念,那就是协程。基本概念协程,又成为微线程。但是却有着很大的区别协程是一个线程执行。不需要多线程的锁机制。这也说明协程的执行效率很高一些。

协程

要理解generator就必须知道一个概念,那就是协程

1. 基本概念

协程,又成为微线程(coroutine)。

进程(process) vs 线程(thread)

我们都知道在操作系统级别上有两个重要的概念(也是实体):进程(process)和线程(thread),这两个东西是用于操作系统模拟并行的,在单个CPU上,os通过调度算法,让CPU轮流执行线程或者进程,来达到程序的并发执行。

那么协程又是什么?首先要明确的是,协程是编译器级别的,而并非线程和进程一样是操作系统级别的。协程的实现,通过是对某个语言做相应的提议,然后通过后成编译器标准,然后编译厂商来实现该机制。

2. 作用

协程的作用是什么?

简单来说,就是实现函数的分段式执行。就是一个函数的执行可以主动放弃CPU的控制权,先挂起,让其他的函数先执行,然后在返回,从上次执行结束的地方继续执行。

这样看起来很像是多线程轮流执行。但是却有着很大的区别:协程是一个线程执行

因为是一个线程执行,所以不存在线程的切换,而是由程序自身控制,也就不存在所谓的线程切换的开销。

不需要多线程的锁机制。因为只有一个线程,也就不存在同时写变量的冲突。在协程中控制共享资源不加锁,只需要判断状态就好了。这也说明协程的执行效率很高一些。

举个生产者消费者模型基于抢占式多线程编程的实现(伪代码)

// 资源,队列容器
var q = [];

// 消费者进程
loop(); // 循环等待
lock(q); // 加锁
var item = getResourceFrom(q); // 获取资源
unlock(q); // 操作结束,资源解锁
operatingResource(item);
sleep;

// 生成者线程
loop(); // 循环等待
var item = createResource(p); // 生产资源
lock(q); // 加锁
q.push(item); // 写入资源
unlock(q); // 解锁

可以看到,以上的代码中有两个特点

对资源操作需要进行加锁和解锁的操作。(保证线程安全)

消费者线程必须通过sleep,让出CPU,用于执行生产者线程使用。

那么如果是协程的编程模式,就简单地多。

var q = [];
var count = 0;

// 消费者
function *consumer() {
    while (true){
       var item = yield producer();
       console.log(item); 
    }
}

// 生产者
function producer() {
    q.push(count++);
}

function main () {
    const consumerGen = consumer();
    // 我们可以通过代码来控制其交替执行

    // 执行到获取item之前,放弃执行权,先执行producer(),
    consumerGen.next();
    // 之后可以获取item,然后再放弃执行权,执行producer,一直循环
    consumerGen.next(q.shift()); // 0
    consumerGen.next(q.shift()); // 1
    consumerGen.next(q.shift()); // 2
    consumerGen.next(q.shift()); // 3
    consumerGen.next(q.shift()); // 4
    consumerGen.next(q.shift()); // 5
}

main();
最后说几句

好久在这上面写博客了,最近一直忙于毕业设计和学习node。

参考

协程-廖雪峰

C++ 协程与网络编程

谈谈协程和C语言的协程

协程(Coroutine)并不是真正的多线程

协程(一)原理

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/80849.html

相关文章

  • 聊聊 2018 年后端技术趋势

    摘要:现在在后端业务开发编程方面,技术力量强的团队已经开始将技术栈从同步模式切换为异步了。使用这些技术方案是无法兼容已有程序的。影响了异步回调技术栈的普及。将会成为未来后端开发领域的主流技术方案。 今天太忙,少写一点,后面再补充。 异步模式 Go 语言越来越热门,很多大型互联网公司后端正在转向 GO 。Java 圈知名的服务化框架 Dubbo 也宣布转型异步模式。这是一个大趋势,异步模式已经...

    Miyang 评论0 收藏0
  • 深度学习批任务处理调度器与kubernetes默认调度器融合

    摘要:这样就会有一个问题一个任务要起个,每个需要一张卡,总共需要张卡,而集群中只有张空闲的卡,这样默认的调度器会如何处理因为默认调度器是一个一个调度的,只会检查单个资源够不够,这样前个都能成功,最后一个调度失败。 kubernetes集群三步安装 什么是批处理任务 深度学习中经常会出现多机多卡的任务,也就是同事会起多个pod,但是这多个pod属于同一个任务。 这样就会有一个问题 一个任务要起...

    xiao7cn 评论0 收藏0
  • 深度学习批任务处理调度器与kubernetes默认调度器融合

    摘要:这样就会有一个问题一个任务要起个,每个需要一张卡,总共需要张卡,而集群中只有张空闲的卡,这样默认的调度器会如何处理因为默认调度器是一个一个调度的,只会检查单个资源够不够,这样前个都能成功,最后一个调度失败。 kubernetes集群三步安装 什么是批处理任务 深度学习中经常会出现多机多卡的任务,也就是同事会起多个pod,但是这多个pod属于同一个任务。 这样就会有一个问题 一个任务要起...

    dcr309duan 评论0 收藏0
  • 我为什么对 PHP yield 协程和 swoole 不感冒?

    摘要:最大的优势在于快速开发,劣势在于效率和工程规范。协程异步这些技术相对学习成本高,优势在于性能提升明显。的协程和异步实现的太不优雅。有兴趣研究协程的人必然会去对比的甚至的多线程。对比之后就不难发现,的实现太粗糙了。 离开需求场景谈技术是无意义的。PHP 最大的优势在于快速开发,劣势在于效率和工程规范。协程、异步这些技术相对学习成本高,优势在于性能提升明显。这跟 PHP 语言本身的优势形...

    Tychio 评论0 收藏0
  • PyTips 0x13 - Python 线程与协程(2)

    摘要:项目地址我之前翻译了协程原理这篇文章之后尝试用了模式下的协程进行异步开发,确实感受到协程所带来的好处至少是语法上的。 项目地址:https://git.io/pytips 我之前翻译了Python 3.5 协程原理这篇文章之后尝试用了 Tornado + Motor 模式下的协程进行异步开发,确实感受到协程所带来的好处(至少是语法上的:D)。至于协程的 async/await 语法是如...

    史占广 评论0 收藏0

发表评论

0条评论

UCloud

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<