zoukankan      html  css  js  c++  java
  • 协程

     协程理解为同步的线程,每个时刻只有一个协程在运行。

    coroutine.create() 创建 coroutine,返回 coroutine, 参数是一个函数,当和 resume 配合使用的时候就唤醒函数调用
    coroutine.resume() 重启 coroutine,和 create 配合使用
    coroutine.yield() 挂起 coroutine,将 coroutine 设置为挂起状态,这个和 resume 配合使用能有很多有用的效果
    coroutine.status() 查看 coroutine 的状态
    注:coroutine 的状态有三种:dead,suspended,running,具体什么时候有这样的状态请参考下面的程序
    coroutine.wrap() 创建 coroutine,返回一个函数,一旦你调用这个函数,就进入 coroutine,和 create 功能重复
    coroutine.running() 返回正在跑的 coroutine,一个 coroutine 就是一个线程,当使用running的时候,就是返回一个 corouting 的线程号

    -- coroutine_test.lua 文件
    co = coroutine.create(
        function(i)
            print(i);
        end
    )
     
    coroutine.resume(co, 1)   -- 1
    print(coroutine.status(co))  -- dead
     
    print("----------")
     
    co = coroutine.wrap(
        function(i)
            print(i);
        end
    )
     
    co(1)
     
    print("----------")
     
    co2 = coroutine.create(
        function()
            for i=1,10 do
                print(i)
                if i == 3 then
                    print(coroutine.status(co2))  --running
                    print(coroutine.running()) --thread:XXXXXX
                end
                coroutine.yield()--挂起
            end
        end
    )
     
    coroutine.resume(co2) --1
    coroutine.resume(co2) --2
    coroutine.resume(co2) --3
     
    print(coroutine.status(co2))   -- suspended
    print(coroutine.running())---nil
     
    print("----------")

    ====================

    外部线程和协程的数据传递

    coroutine.resume(co,x)--首次调用传递给协程函数

    返回值:1-true/false--表示调用是否成功

                   2-值v或没有---m=coroutine.yield(v)这个在协程函数内调用,会传递值给外部

    后续coroutine.resume(co,y)调用,会把y传递给上面的m.

    function foo (a)
        print("foo 函数输出", a)
        return coroutine.yield(2 * a) -- 返回  2*a 的值
    end
     
    co = coroutine.create(function (a , b)
        print("第一次协同程序执行输出", a, b) -- co-body 1 10
        local r = foo(a + 1)
         
        print("第二次协同程序执行输出", r)
        local r, s = coroutine.yield(a + b, a - b)  -- a,b的值为第一次调用协同程序时传入
         
        print("第三次协同程序执行输出", r, s)
        return b, "结束协同程序"                   -- b的值为第二次调用协同程序时传入
    end)
           
    print("main", coroutine.resume(co, 1, 10)) -- true, 4
    print("--分割线----")
    print("main", coroutine.resume(co, "r")) -- true 11 -9
    print("---分割线---")
    print("main", coroutine.resume(co, "x", "y")) -- true 10 end
    print("---分割线---")
    print("main", coroutine.resume(co, "x", "y")) -- cannot resume dead coroutine
    print("---分割线---")

    以上实例执行输出结果为:

    第一次协同程序执行输出    1    10
    foo 函数输出    2
    main    true    4
    --分割线----
    第二次协同程序执行输出    r
    main    true    11    -9
    ---分割线---
    第三次协同程序执行输出    x    y
    main    true    10    结束协同程序
    ---分割线---
    main    false    cannot resume dead coroutine
    ---分割线---
  • 相关阅读:
    主机与虚拟机通信:以主机VS2010连接虚拟机MySql为例
    Json与类对象转换
    VS附加到进程调试的方法及应用场景
    地图API使用文档-以腾讯地图为例
    JS使用ActiveXObject读取数据库代码示例(只支持IE)
    css文件内引用外部资源文件的相对路径
    ::after,::before使用
    高德地图API应用
    LogNet4学习笔记
    MvcPager分页控件的使用
  • 原文地址:https://www.cnblogs.com/justart/p/11652599.html
Copyright © 2011-2022 走看看