参考:Lua中的协同程序 coroutine   http.lua

协同程序(Coroutine):

  三个状态:suspended(挂起,协同刚创建完成时或者yield之后)、running(运行)、dead(函数走完后的状态,这时候不能再重新resume)。

  coroutine.create(arg):根据一个函数创建一个协同程序,参数为一个函数

  coroutine.resume(co):使协同从挂起变为运行(1)激活coroutine,也就是让协程函数开始运行;(2)唤醒yield,使挂起的协同接着上次的地方继续运行。该函数可以传入参数

  coroutine.status(co):查看协同状态

  coroutine.yield():使正在运行的协同挂起,可以传入参数

优点:可以通过resume-yield来交换数据

示例代码一

消费者驱动的生产者-消费者模型

  1. produceFunc = function()
  2. while true do
  3. local value = io.read()
  4. print("produce: ", value)
  5. coroutine.yield(value) -- 返回生产的值给coroutine.resume()
  6. end
  7. end
  8.  
  9. consumer = function(p)
  10. while true do
  11. local status, value = coroutine.resume(p); -- 唤醒生产者进行生产,并接受coroutine.yield()的值进行消费
  12. print("consume: ", value)
  13. end
  14. end
  15.  
  16. -- 消费者驱动的设计,也就是消费者需要产品时找生产者请求,生产者完成生产后提供给消费者
  17. producer = coroutine.create(produceFunc)
  18. consumer(producer)

在生产消费环节之间加入一个中间处理的环节(过滤器):

  1. produceFunc = function()
  2. while true do
  3. local value = io.read()
  4. print("produce: ", value)
  5. coroutine.yield(value) -- 返回生产的值
  6. end
  7. end
  8.  
  9. filteFunc = function(p)
  10. while true do
  11. local status, value = coroutine.resume(p);
  12. value = value *100 -- 放大一百倍
  13. coroutine.yield(value)
  14. end
  15. end
  16.  
  17. consumer = function(f, p)
  18. while true do
  19. local status, value = coroutine.resume(f, p); -- 唤醒生产者进行生产
  20. print("consume: ", value)
  21. end
  22. end
  23.  
  24. -- 消费者驱动的设计,也就是消费者需要产品时找生产者请求,生产者完成生产后提供给消费者
  25. producer = coroutine.create(produceFunc)
  26. filter = coroutine.create(filteFunc)
  27. consumer(filter, producer)  

示例代码二:

生产者驱动的生产者-消费者模型

  1. local co_yield = coroutine.yield
  2. local co_create = coroutine.create
  3. local co_status = coroutine.status
  4. local co_resume = coroutine.resume
  5.  
  6. consumeFunc = function()
  7. for i = 1,10 do
  8. local value = co_yield() -- 通过coroutine.yield()来接收 coroutine.resume()传递的值
  9. print("consume: ",value)
  10. end
  11. end
  12.  
  13. produceFunc = function(consumer)
  14. for i = 1,10 do
  15. local value = io.read()
  16. print("produce: ",value)
  17. co_resume(consumer, value) -- 唤醒消费者进行消费
  18. end
  19. end
  20.  
  21. consumer = co_create(consumeFunc)
  22. co_resume(consumer) -- 唤醒消费准备开始消费
  23. produceFunc(consumer)

注意:在启动coroutine的时候,resume的参数是传给主程序的;在唤醒yield的时候,参数是传递给yield的  

Lua的协程基础的更多相关文章

  1. Lua的协程和协程库详解

    我们首先介绍一下什么是协程.然后详细介绍一下coroutine库,然后介绍一下协程的简单用法,最后介绍一下协程的复杂用法. 一.协程是什么? (1)线程 首先复习一下多线程.我们都知道线程——Thre ...

  2. pyhon——进程线程、与协程基础概述

    一直以来写博客都是实用主义者,只写用法,没信心写原理,但是每一次写作业的过程都有一种掘地三尺的感觉,终于,写博客困难症重症患者经历了漫长的思想斗争,还是决定把从网上淘到的各种杂货和自己的总结放在一起, ...

  3. Lua的协程(coroutine)

    -------------------------------------------------------------------------------- -- 不携带参数 ---------- ...

  4. Kotlin协程基础

    开发环境 IntelliJ IDEA 2021.2.2 (Community Edition) Kotlin: 212-1.5.10-release-IJ5284.40 我们已经通过第一个例子学会了启 ...

  5. Unity协程基础用法

    //通过StartCoroutine()开始一个协程//通过StopCoroutine();关闭一个协程//通过StopAllCoroutines()方法来实现关闭所有协程void Start(){D ...

  6. [golang note] 协程基础

    协程概念 √ 协程通常称为coroutine,在golang中称为goroutine. √ 协程本质上是一种用户态线程,它不需要操作系统来进行抢占式调度,在实际实现中寄存在线程之中. √ 协程系统开销 ...

  7. 协程基础_context系列函数

    近期想看看协程,对这个的详细实现不太了解.查了下,协程最常规的做法就是基于makecontext,getcontext,swapcontext这类函数在用户空间切换用户上下文. 所以在这通过样例代码尽 ...

  8. 用Lua的协程实现类似Unity协程的语句块

    local co_time_tbl = {} setmetatable(co_time_tbl, { __len = function(o) for k, v in pairs(o) do count ...

  9. lua 15 协程-协同程序

    转自:http://www.runoob.com/lua/lua-coroutine.html 什么是协同(coroutine)? Lua 协同程序(coroutine)与线程比较类似:拥有独立的堆栈 ...

随机推荐

  1. 不能靠眼睛之 KEIL 中失效代码灰暗特性

    @2019-02-15 [问题描述] 使用 KEIL(带灰暗特性版本) 查看头文件代码时,其中有依据不同宏定义对应不同执行语句代码部分,依据灰暗特性呈现生效与失效代码,靠眼睛反应就是灰暗呈现为失效代码 ...

  2. BZOJ2406矩阵

    题目描述 题解 最大值最小,一眼二分没的说. 然后考虑建出这么个图,每行看做一个点,每列看做一个点,每个点看做一条连接行与列的边,源点向每行连s-mid__s+mid的边,行与列连L__R的边,列到汇 ...

  3. ACM-ICPC 2015 BeiJing

    比赛连接:ACM-ICPC 2015 BeiJing 本次比赛只写了 A G     然后 I题随后补 A 有一个正方形土地,上面有若干块绿洲.让你以x0为界限划一条竖线,要求左边绿洲面积>=右 ...

  4. Nodejs nmp 常用命令

    npm是一个node包管理和分发工具,已经成为了非官方的发布node模块(包)的标准.有了npm,可以很快的找到特定服务要使用的包,进行下载.安装以及管理已经安装的包. 1.npm install m ...

  5. APP reset.css

    html { box-sizing: border-box; } * { user-select: none; -webkit-tap-highlight-color: rgba(255,255,25 ...

  6. 第十五篇-EditText做简单的登录框

    TextView和EditText的简单应用. MainActivity.java package com.example.aimee.edittexttest; import android.sup ...

  7. linux系统调用之用户管理

    getuid 获取用户标识号 setuid 设置用户标志号 getgid 获取组标识号 setgid 设置组标志号 getegid 获取有效组标识号 setegid 设置有效组标识号 geteuid ...

  8. 第七节,TensorFlow编程基础案例-TensorBoard以及常用函数、共享变量、图操作(下)

    这一节主要来介绍TesorFlow的可视化工具TensorBoard,以及TensorFlow基础类型定义.函数操作,后面又介绍到了共享变量和图操作. 一 TesnorBoard可视化操作 Tenso ...

  9. Day27--Python--初识socket

    一. C\S架构, 客户端服务端架构 客户端(client): 享受服务端提供的服务 服务端(server): 给客户端提供服务 B\S 浏览器和服务端 B (browser) 二. 网络通信的整个流 ...

  10. appium desktop 1.7 的swipe功能不能用,重写。

    rt // @Override public void swipe(int startx,int starty,int endx,int endy,int ms){ Duration duration ...