8.lua学习笔记:协程

来源:互联网 发布:mac yosemite 下载 编辑:程序博客网 时间:2024/06/05 03:26
1.协程基础:
    lua把所有协程相关的函数都放在coroutine的table中,create接受一个函数参数用于创建协程,这个参数就是协程的执行过程,
每个协程有四种状态:suspended(挂起),running(运行),dead(死亡,执行完),normal(正常)
    co = coroutine.create( function () print("hello") end)
    print( coroutine.status(co) )        ------suspended(刚创建的协程处于挂起状态,不会自动执行)
    coroutine.resume(co)                  ------hello(唤醒后执行打印语句)
    print( coroutine.status(co) )        ------dead(执行完了,协程结束)

协程的真正威力在于yield的使用,通过resume和yield的交互,可以在不同的协程间传递数据:
    function  test( a, b )
            res = coroutine.yield( a+b,  a - b )
            print("res:" .. res)
    end
    
    co = coroutine.create(test)
    print( coroutine.resume(co , 12, 5) )  ---------true      17        7 
    print( coroutine.resume(co , 12, 5) )  ---------res: 12       /n     true  (此处res:12是协程打印的,而True是当前进程打印的
从上面可以看出,协程每次唤醒后执行到yield,yield语句执行到抛出结果后挂起,等待下次唤醒,下次唤醒,从yield处接收信息开始;
首次resume传入的参数是传给协程住函数的,即test;如果协程函数有return语句,则最后一次resume将会收到协程return的结果

协程A唤醒协程B,此时,协程A既不是running状态,也不是dead状态,而是normal状态;yield能传出多个结果,也能接收多个值


0 0
原创粉丝点击