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)
这里一共使用了两个函数co
与yield
co
接收一个函数为参数,该函数由coroutine
协程去执行
yield
接收一个函数为参数,传入的函数会有一个next
函数类型的参数,返回值为next
函数传入的值,即
local result = yield(function(next)
next("success") -- 调用next()表示该函数运行结束,如果没有返回值直接next()即可
end)
-- result: success
以上是关于Lua中协程的使用的主要内容,如果未能解决你的问题,请参考以下文章