美文网首页
js中的协程

js中的协程

作者: GDUF_XRT | 来源:发表于2021-11-05 10:45 被阅读0次

进程

程序运行的一个实例,即程序运行的时候系统环境变量和用到的资源以及本身代码的集合。特点是一个CPU核心同一时间内只能运行一个进程。这对于并发来说是一个障碍,所以引入了更轻量的线程。

线程

线程是操作系统能够进行运算的最小单位。线程可以并发执行并共享进程中的资源。其中,并发使用了时间切片,即为每一个线程分配cpu时间,执行超过分配的时间,就强制执行下一个等待的线程。这部分是系统进行调度的,用户不需要介入。

并发

并发是指一段时间内(程序开始运行到结束的这段时间)执行多个程序(线程算是一个进程的子程序)。

协程

线程解决了进程阻塞和并发的问题,类似的,协程解决了线程阻塞和并发的问题。

不同的是,线程是为了操作系统“同时”运行更多的程序。协程是为了让一个线程内的程序并发服务更多内容。

将线程中的代码继续细分为多个任务,然后像时间片轮转一样不断去执行这些任务。不同的是,线程切换是由操作系统的时间片控制的,而协程是程序自己实现的。
协程的切换不是按照时间来算的,而是按照代码既定分配,就是说代码运行到这一行才启动协程,协程是可以由我们程序员自己操控的。

示意图

其与线程的区别有:

  • 线程可以有多个协程,但同一时间内只能运行一个协程。
  • 线程是系统调度,协程是应用自己调度。

js 主线程中运行协程的过程如下:

第一步,协程A开始执行。

第二步,协程A执行到一半,进入暂停,执行权转移到协程B。

第三步,(一段时间后)协程B交还执行权。

第四步,协程A恢复执行。

协程是一种比线程更加轻量级的存在。你可以把协程看成是跑在线程上的任务,一个线程上可以存在多个协程,但是在线程上同时只能执行一个协程。比如,当前执行的是 A 协程,要启动 B 协程,那么 A 协程就需要将主线程的控制权交给 B 协程,这就体现在 A 协程暂停执行,B 协程恢复执行;同样,也可以从 B 协程中启动 A 协程。通常,如果从 A 协程启动 B 协程,我们就把 A 协程称为 B 协程的父协程。最重要的是,协程不是被操作系统内核所管理,而完全是由程序所控制(也就是在用户态执行)。这样带来的好处就是性能得到了很大的提升,不会像线程切换那样消耗资源。

生成器 generator

js 中的生成器利用的就是协程,利用协程,可以实现函数暂停执行和函数恢复执行。

执行生成器的过程如下:

function* getResult() {
    let id_res = yield fetch(id_url);
    console.log(id_res)
    let id_text = yield id_res.text();
    console.log(id_text)


    let new_name_url = name_url + "?id=" + id_text
    console.log(new_name_url)


    let name_res = yield fetch(new_name_url)
    console.log(name_res)
    let name_text = yield name_res.text()
    console.log(name_text)
}


let result = getResult()
result.next().value.then((response) => {
    return result.next(response).value
}).then((response) => {
    return result.next(response).value
}).then((response) => {
    return result.next(response).value
}).then((response) => {
    return result.next(response).value

可见手动执行生成器很麻烦,需要写很多重复的代码。于是有人把执行的这部分代码抽象为co.js,使用co.js只需下面这行代码:

co(getResult()).then(res => {})

但是也引入了外部的代码,为了解决这个问题,ES7 引入了 async/await。

async/await

它改进了生成器的缺点,提供了在不阻塞主线程的情况下使用同步代码实现异步访问资源的能力。其实 async/await 技术背后的秘密就是 Promise 和生成器应用,往底层说,就是微任务和协程应用。

相关文章

  • js中的协程

    进程 程序运行的一个实例,即程序运行的时候系统环境变量和用到的资源以及本身代码的集合。特点是一个CPU核心同一时间...

  • 4.协程的异常处理(2)

    异常的传播异常传播是指异常在父子协程中的传播,什么是父子协程,在当前协程中又启动一个协程,那么这个新启动的协程就是...

  • 协程.md

    协程协程中使用suspend修饰方法,代表该方法可在协程中挂起。但并不是协程方法必须使用suspend修饰协程和线...

  • Linux高性能网络:协程系列01-概述

    协程 我们只听说过进程和线程,没有听说过协程,协程是个什么东西呢?我们的go语言,node.js语言的实现都使用到...

  • 协程调度 与 生命周期

    我们可以为协程指定上下文环境 子协程 当一个协程被其它协程在 CoroutineScope 中启动的时候, 它将通...

  • kotlin<第七篇>:协程基础

    一、什么是协程? 二、Android中协程用来解决什么问题? 三、需要添加地依赖 四、创建协程 五、协程的两部分 ...

  • 破解 Kotlin 协程(5) - 协程取消篇

    关键词:Kotlin 协程 协程取消 任务停止 协程的任务的取消需要靠协程内部调用的协作支持,这就类似于我们线程中...

  • Kotlin协程使用

    目录 协程的用法 协程同步异步请求与Rxjava,原生写法的区别与优势 对于协程的理解 1.协程的用法 在安卓中添...

  • kotlin协程的使用与原理

    协程 协程是轻量级线程,一个线程中可以有很多协程,协程本质上可以认为是运行在线程上的代码块,协程提供的挂起操作会使...

  • 关于协程开发

    协程: 1.什么是协程 协程,经常被称为微线程,纤程,是一种多任务并发的操作手段定义:协程是运行在单线程中的并发程...

网友评论

      本文标题:js中的协程

      本文链接:https://www.haomeiwen.com/subject/dntrzltx.html