协程
协程
协程( 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()
来源:oschina
链接:https://my.oschina.net/u/4162046/blog/3221541