一 协程
(1)lua协程和普通线程区别
协程是一种'非抢占式[non-preemptive]'多线程 -->"咬住不松口"
核心点:协程把线程中'不确定的地方'尽可能的去掉,执行序列间的'切换'不再由CPU'隐藏'的进行,而是由程序'显式'的进行.
所以:使用'协程实现并发',需要多个协程'彼此协作'.
补充1:lua协程是'非对称'协程,需要'两个函数'来控制协程的运行,一个'挂起'协程的执行,一个'恢复'协程的执行
补充2:lua协程拥有'独立的堆栈',独立的'局部变量',独立的'指令指针,,同时又与其它协同程序'共享'全局变量和其它'大部分'东西
(2)lua协程的方法概要
(3)协程的状态
二 协程基础
核心:各个方法'离散'的讲解
(1) create
① 匿名函数
协程'四种状态'的'2种' --> suspended、dead
② 非匿名函数
参数 -->'函数名'
(2) yield
作用:让出'执行权'
① 案例1
② 案例2
③ 返回值
说明: 函数'coroutine.yield'的'返回值'是'对应'resume的参数
备注: 不一定非得'print',也可以用'变量'来接收
通俗的理解: 'resume传入参数'作为'上次断点'的yield的'返回值' -->'执行顺序'的角度
(3) resume
++++++++++++++resume以'保护模式'运行++++++++++++++
1. 协程执行中'不报错',则返回'ture和'函数'运行结果'
2. 协程执行中'报错',lua语言不显示'错误信息',而是将'错误'信息返回给'函数resume' --> 'false'和'错误信息'
① 协程无yield
观察: 三个案例的'差异性'
1)案例1
说明:第一次调用resume的时候程序'没有yield在等',因此resume除co'以外的参数(2,3,5)'都传递给协同主程序'(a,b,c)接收'
2)案例2
3)案例三
② resume返回值
明确一点:协程体函数'接收'参数只与'第一次resume函数传入'的参数有关
(4)两者的关联
核心:体会yield和resume这两个参数是如何来'交换数据'的?
(5)wrap
三 生产者和消费者
(1)伪代码描述
(2)消费者驱动
消费者驱动模式:程序通过'call consumer'来启动
1. 当'consumer'需要'new value'去消费时,就会唤醒'producter'
2. 'producter'生产之后,就向'consumer'返回'新值'后挂起,直到'消费者'再次被'生产者'唤醒
+++++++++++++++++"关键点"+++++++++++++++++
1. 两个'while true'死循环
2. 当'一个协程'调用'函数yield'时,它'不是'进入一个'新函数',而是'返回'一个挂起的'调用'
挂起的调用:调用的函数是'resume'
3. 当'一个协程'调用'函数resume'时,它'不是'进入一个'新函数',而是'返回'一个挂起的'调用'
挂起的调用:调用的函数是'yield'
4. 基于成对的'resume-yield'来颠倒'调用者'和'被调用者'之间的联系
5. send'之后'让出'执行权'
生产者驱动省略
(2)使用过滤器的生产者和消费者
p = producer()
f = filter(p)
consumer(f) --> '启动消费者'
lua中的'标签'使用'双冒号' -->"::"