Lua基础(十六)协程 Coroutine

一    协程

聊一聊python和golang的协程区别

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

彻底理解什么是协程

(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)   --> '启动消费者'

lua5.3中文参考手册

lua中的'标签'使用'双冒号' -->"::"
  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值