一 协程
(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中的'标签'使用'双冒号' -->"::"
博客主要探讨协程相关知识,对比了Python和Go的协程区别,帮助程序员理解高并发中的协程。详细介绍了Lua协程与普通线程的区别、方法概要和状态,还阐述了协程基础操作,如create、yield、resume等,最后给出生产者和消费者的伪代码及实现方式。

1197

被折叠的 条评论
为什么被折叠?



