zoukankan      html  css  js  c++  java
  • Lua的协程基础

    参考: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来交换数据

    示例代码一

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

    produceFunc = function()
        while true do
            local value = io.read()
            print("produce: ", value)
            coroutine.yield(value)        -- 返回生产的值给coroutine.resume()
        end
    end
    
    consumer = function(p)
        while true do
            local status, value = coroutine.resume(p);        -- 唤醒生产者进行生产,并接受coroutine.yield()的值进行消费
            print("consume: ", value)
        end
    end
    
    -- 消费者驱动的设计,也就是消费者需要产品时找生产者请求,生产者完成生产后提供给消费者
    producer = coroutine.create(produceFunc)
    consumer(producer)
    

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

    produceFunc = function()
        while true do
            local value = io.read()
            print("produce: ", value)
            coroutine.yield(value)        -- 返回生产的值
        end
    end
    
    filteFunc = function(p)
        while true do
            local status, value = coroutine.resume(p);
            value = value *100            -- 放大一百倍
            coroutine.yield(value)
        end
    end
    
    consumer = function(f, p)
        while true do
            local status, value = coroutine.resume(f, p);        -- 唤醒生产者进行生产
            print("consume: ", value)
        end
    end
    
    -- 消费者驱动的设计,也就是消费者需要产品时找生产者请求,生产者完成生产后提供给消费者
    producer = coroutine.create(produceFunc)
    filter = coroutine.create(filteFunc)
    consumer(filter, producer)  

    示例代码二:

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

    local co_yield = coroutine.yield
    local co_create = coroutine.create
    local co_status = coroutine.status
    local co_resume = coroutine.resume
    
    
    consumeFunc = function()
    	for i = 1,10 do
    		local value = co_yield()          -- 通过coroutine.yield()来接收 coroutine.resume()传递的值
    		print("consume: ",value)
    	end
    end
    
    produceFunc = function(consumer)
    	for i = 1,10 do
    		local value = io.read()
    		print("produce: ",value)
    		co_resume(consumer, value)        -- 唤醒消费者进行消费
    	end
    end
    
    consumer = co_create(consumeFunc)
    co_resume(consumer)                -- 唤醒消费准备开始消费
    produceFunc(consumer)
    

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

    作者:Standby一生热爱名山大川、草原沙漠,还有妹子
    出处:http://www.cnblogs.com/standby/

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    ZOJ 3765 Lights (zju March I)伸展树Splay
    UVA 11922 伸展树Splay 第一题
    UVALive 4794 Sharing Chocolate DP
    ZOJ 3757 Alice and Bod 模拟
    UVALive 3983 捡垃圾的机器人 DP
    UVA 10891 SUM游戏 DP
    poj 1328 Radar Installatio【贪心】
    poj 3264 Balanced Lineup【RMQ-ST查询区间最大最小值之差 +模板应用】
    【转】RMQ-ST算法详解
    poj 3083 Children of the Candy Corn 【条件约束dfs搜索 + bfs搜索】【复习搜索题目一定要看这道题目】
  • 原文地址:https://www.cnblogs.com/standby/p/7880366.html
Copyright © 2011-2022 走看看