zoukankan      html  css  js  c++  java
  • lua学习笔记13:协程具体解释和举例

    一、coroutine.create创建协程
    參数是协程的主函数,返回一个thread对象
    co = coroutine.create(function()
    	print("coroutine execute!")
    end)
    

    二、协程状态
    协程有三种状态:挂起(suspended)、执行(running)和死亡(dead)
    coroutine.status(co)返回协程当前的状态
    协程创建完之后处于挂起状态
    print(coroutine.status(co))

    输出:

    suspended


    三、运行协程
    协程运行后。状态变为running,当协程主所有运行完之后,变为dead状态

    coroutine.resume(co)
    print(coroutine.status(co))

    输出:

    dead


    主函数运行完时。它的返回的值和true一起作为相应resume的返回值
    co = coroutine.create(function(a, b)
    	print("coroutine execute!")
    	return a + b
    end)
    print(coroutine.resume(co, 2, 3))

    输出:

    ture 5


    四、中断协程
    主函数运行过程中遇到coroutine.yield()中断,再次调用resume将从中断的位置開始运行
    co = coroutine.create(function()
    	for i = 1, 2 do
    		print("before", i)
    		coroutine.yield()
    		print("after", i)
    	end
    end)
    print(coroutine.status(co))
    coroutine.resume(co)
    print(coroutine.status(co))
    coroutine.resume(co)
    print(coroutine.status(co))
    coroutine.resume(co)
    print(coroutine.status(co))
    输出:
    suspended
    before 1
    suspended
    after 1
    before 2
    suspended
    after 2

    dead


    假设是被挂起yield函数有传參,这些參数和true一起作为相应resume的返回值
    co = coroutine.create(function(a)
    	a = a + 1
    	coroutine.yield(a)
    	a = a + 1
    	return a
    end)
    print(coroutine.status(co))
    print(coroutine.resume(co,1))
    print(coroutine.status(co))
    print(coroutine.resume(co,1))
    print(coroutine.status(co))
    输出:
    suspended
    true 2
    suspended
    true 3
    dead


    五、coroutine.wrap创建协程
    參数是协程的主函数。返回一个函数,每当调用这个返回函数,都会运行协程主函数。
    返回值时yield或主函数的返回值,没有执行结果布尔值和错误码,因此无法检測出执行时的错误。也无法检查 wrap 所创建的协程的状态。


    function co_func(a)
        local c = coroutine.yield(a + 1)
        return c * 2
    end
    
    co = coroutine.wrap(co_func)
    
    ret1 = co(1)
    print(ret1)
    
    ret2 = co(10)
    print(ret2)
    输出:
    2
    20


    运行一次协程对象。协程就会被激活一次,再次调用时从上一次断点的地方继续运行。

    挂起时yield的參数将作为返回值,再次激活时的參数将作为yield的返回值。



    六、获得执行中的协程
    函数 coroutine.running 用于返回正在执行中的协程,假设没有协程执行。则返回 nil
    print("running:",coroutine.running())
    co = coroutine.create(function()
        print("running:",coroutine.running())
        print("is co:", coroutine.running() == co)
    	print("status:", coroutine.status(coroutine.running()))
    end)
    coroutine.resume(co)
    print("running:",coroutine.running())
    输出:
    running: nil
    running: thread: 006DC380
    is co: true
    status: running
    running: nil


  • 相关阅读:
    GO语言网络编程
    GO语言测试
    GO语言反射
    GO语言strconv包的使用
    GO语言并发
    Centos7 开启swap分区
    设计模式 之 命令模式
    设计模式 之 代理模式
    设计模式 之 工厂模式
    设计模式 之 观察者模式
  • 原文地址:https://www.cnblogs.com/claireyuancy/p/6691854.html
Copyright © 2011-2022 走看看