协程

时光总嘲笑我的痴心妄想 提交于 2020-04-06 12:02:14

协程

协程

协程coroutine )表示一种程序运行的方式,可以理解成 “协作的线程” 或 “协作的函数

协程既可以用单线程实现:是一种特殊的子例程;也可以用多线程实现:是一种特殊的线程

协程与子例程的差异

传统的 “子例程”( subroutine )采用堆栈式 “后进先出” 的执行方式,只有当调用的子函数完全执行完毕,才会结束子函数的执行,并开始执行父函数。

协程与其不同,多个线程(在单线程情况下是多个函数)可以井行执行,但只有一个线程(或函数)处于正在运行的状态,其他线程(或函数)都处于暂停态suspended ),线程(或函数)之间可以交换执行权 。也就是说,一个线程(或函数)执行到一半,可以暂停执行,将执行权交给另一个线程(或函数),等到后面收回执行权的时候,再恢复执行。这种可以并行执行、交换执行权的线程(或函数),就称为协程

从实现上看,在内存中子例程只使用一个stack ),而协程是同时存在多个,但只有一个是处在运行态。也就是说,协程是以多占用内存为代价实现多任务的并行运行

协程与普通线程的差异

        function demo(){
            console.log("demo start")
            setTimeout(function(){
                ickt()
            },2000)
            console.log("demo end")
            //查看调用栈
            console.trace()
        }
        //定义ickt方法
        function ickt(){
            console.log('ickt end')
            //查看调用栈
            console.trace()
        }
        //定义启动方法
        function start(){
            //运行demo
            demo()
        }
        //执行start
        start()

普通协程

Generator协程

function* demo(){
    console.log("demo start")
    console.trace()
    yield 1;
    console.log("demo run")
    yield ickt();
    console.log("demo end")
    console.trace()
}
//定义ickt方法
function ickt(){
    console.log("ickt end")
    console.trace()
}
//定义启动函数
function start(){
    //运行demo()
    let d = demo();
    //第一次获取状态
    d.next();
    //两秒后继续获取状态
    setTimeout(function(){
        d.next();
        d.next()
    },2000)
}
//运行程序
start()

generator

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!