Lua中协程的使用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Lua中协程的使用相关的知识,希望对你有一定的参考价值。

    平常访问网络都会使用回调的方式,现在通过协程改变这种回调的模式,让异步方法按同步的方法来使用

-- co.lua
yield   = coroutine.yield
co      = function(func, cb)
    local cor = coroutine.create(func)
    local next = coroutine.resume
    local hasNext; hasNext = function(status, func, ...)
        -- suspended
        if not status then return end
        -- only function
        if type(func) == "function" then
            -- call function
            func(--[[callback]]function(...)
                hasNext(next(cor, ...))
            end)
        elseif cb then
            cb(func, ...)
        end
    end
    hasNext(next(cor))
end



-- test.lua
require("co")

-- 网络异步操作
function request(url)
    return function(next)
        ...

        next("网络返回结果")
    end
end

-- 运行一个协程方法
co(function()
    local result = yield(request("http://login.9173.com"))
    local result_json = json.decode(result)
    if result_json.ok then
        -- other code
    end
end)



这里一共使用了两个函数coyield


co接收一个函数为参数,该函数由coroutine协程去执行

yield接收一个函数为参数,传入的函数会有一个next函数类型的参数,返回值为next函数传入的值,即

local result = yield(function(next)
    next("success") -- 调用next()表示该函数运行结束,如果没有返回值直接next()即可
end)

-- result: success

以上是关于Lua中协程的使用的主要内容,如果未能解决你的问题,请参考以下文章

Python中协程的实现

Swoole 中协程的使用注意事项及协程中的异常捕获

深入理解Python中协程的应用机制: 使用纯Python来实现一个操作系统吧!!

Unity3D日常开发Unity3D中协程的使用

Lua-Async 协程的高级用法

Lua协程的应用