一    协程

聊一聊python和golang的协程区别

程序员应如何理解高并发中的协程

彻底理解什么是协程

(1)lua协程和普通线程区别

协程是一种'非抢占式[non-preemptive]'多线程  -->"咬住不松口"

核心点:协程把线程中'不确定的地方'尽可能的去掉,执行序列间的'切换'不再由CPU'隐藏'的进行,而是由程序'显式'的进行.

所以:使用'协程实现并发',需要多个协程'彼此协作'.

补充1:lua协程是'非对称'协程,需要'两个函数'来控制协程的运行,一个'挂起'协程的执行,一个'恢复'协程的执行

补充2:lua协程拥有'独立的堆栈',独立的'局部变量',独立的'指令指针,,同时又与其它协同程序'共享'全局变量和其它'大部分'东西

lua主协程和子协程 lua协程原理_lua

lua主协程和子协程 lua协程原理_错误信息_02

(2)lua协程的方法概要

lua主协程和子协程 lua协程原理_lua_03

(3)协程的状态

 

lua主协程和子协程 lua协程原理_lua主协程和子协程_04

  二    协程基础

核心:各个方法'离散'的讲解

(1)   create

lua主协程和子协程 lua协程原理_lua_05

lua主协程和子协程 lua协程原理_junit_06

lua主协程和子协程 lua协程原理_lua主协程和子协程_07

①    匿名函数

lua主协程和子协程 lua协程原理_错误信息_08

协程'四种状态'的'2种' --> suspended、dead

lua主协程和子协程 lua协程原理_lua_09

②    非匿名函数

参数  -->'函数名'

(2)    yield

作用:让出'执行权'

lua主协程和子协程 lua协程原理_lua主协程和子协程_10

lua主协程和子协程 lua协程原理_java_11

①    案例1

lua主协程和子协程 lua协程原理_错误信息_12

lua主协程和子协程 lua协程原理_lua_13

②    案例2

lua主协程和子协程 lua协程原理_lua_14

lua主协程和子协程 lua协程原理_java_15

③    返回值

说明: 函数'coroutine.yield'的'返回值'是'对应'resume的参数

lua主协程和子协程 lua协程原理_lua_16

备注: 不一定非得'print',也可以用'变量'来接收

通俗的理解: 'resume传入参数'作为'上次断点'的yield的'返回值'  -->'执行顺序'的角度

lua主协程和子协程 lua协程原理_lua_17

  

(3)    resume

++++++++++++++resume以'保护模式'运行++++++++++++++

1. 协程执行中'不报错',则返回'ture和'函数'运行结果'

2. 协程执行中'报错',lua语言不显示'错误信息',而是将'错误'信息返回给'函数resume' --> 'false'和'错误信息'

lua主协程和子协程 lua协程原理_lua_18

lua主协程和子协程 lua协程原理_junit_19

lua主协程和子协程 lua协程原理_错误信息_20

①   协程无yield

观察: 三个案例的'差异性'

1)案例1

lua主协程和子协程 lua协程原理_错误信息_21

说明:第一次调用resume的时候程序'没有yield在等',因此resume除co'以外的参数(2,3,5)'都传递给协同主程序'(a,b,c)接收'

lua主协程和子协程 lua协程原理_错误信息_22

2)案例2

lua主协程和子协程 lua协程原理_错误信息_23

lua主协程和子协程 lua协程原理_错误信息_24

3)案例三

lua主协程和子协程 lua协程原理_java_25

lua主协程和子协程 lua协程原理_lua_26

②    resume返回值

lua主协程和子协程 lua协程原理_lua主协程和子协程_27

明确一点:协程体函数'接收'参数只与'第一次resume函数传入'的参数有关

lua主协程和子协程 lua协程原理_java_28

(4)两者的关联

lua主协程和子协程 lua协程原理_lua主协程和子协程_29

核心:体会yield和resume这两个参数是如何来'交换数据'的?

lua主协程和子协程 lua协程原理_lua主协程和子协程_30

lua主协程和子协程 lua协程原理_lua_31

(5)wrap

lua主协程和子协程 lua协程原理_错误信息_32

三    生产者和消费者

(1)伪代码描述

lua主协程和子协程 lua协程原理_lua主协程和子协程_33

消费者驱动

消费者驱动模式:程序通过'call consumer'来启动

1.  当'consumer'需要'new value'去消费时,就会唤醒'producter'

2.  'producter'生产之后,就向'consumer'返回'新值'后挂起,直到'消费者'再次被'生产者'唤醒

+++++++++++++++++"关键点"+++++++++++++++++

1.  两个'while true'死循环

2.  当'一个协程'调用'函数yield'时,它'不是'进入一个'新函数',而是'返回'一个挂起的'调用'

    挂起的调用:调用的函数是'resume'

3.  当'一个协程'调用'函数resume'时,它'不是'进入一个'新函数',而是'返回'一个挂起的'调用'

    挂起的调用:调用的函数是'yield'

4.  基于成对的'resume-yield'来颠倒'调用者'和'被调用者'之间的联系

5.  send'之后'让出'执行权'

lua主协程和子协程 lua协程原理_lua_34

lua主协程和子协程 lua协程原理_junit_35

生产者驱动省略

(2)使用过滤器的生产者和消费者

lua主协程和子协程 lua协程原理_lua_36

p = producer()
f = filter(p)
consumer(f)   --> '启动消费者'

lua主协程和子协程 lua协程原理_java_37

lua5.3中文参考手册

lua中的'标签'使用'双冒号' -->"::"