两个协程,通过resume/yield函数参数(或者return语句)向对方传送数据,通过resume/yield函数返回值来从对方处获取传送数据
function coroutine_func(resume1.Args)
yield1 return resume2.Args
yield2 return resume3.Args
end
yield1 return resume2.Args
yield2 return resume3.Args
end
resume1() return
true,yield1.Args
resume2() return true,yield2.Args
resume3() return true,coroutine_func.return
将Resume作为一个服务A, coroutine_func作为一个服务B
则 A传递数据(resume1.Args)给B, B获取后(由函数的参数获取),把响应数据(yield1.Args)>
A继续传递数据给(resume2.Args)给B,B获取后(由yield1.return获取),把响应数据(yield2.A
即,A(resume)和B(yield)都是通过参数来向对方传送数据,而通过返回值来从对方处获取传送
resume2() return true,yield2.Args
resume3() return true,coroutine_func.return
将Resume作为一个服务A, coroutine_func作为一个服务B
则 A传递数据(resume1.Args)给B, B获取后(由函数的参数获取),把响应数据(yield1.Args)>
A继续传递数据给(resume2.Args)给B,B获取后(由yield1.return获取),把响应数据(yield2.A
即,A(resume)和B(yield)都是通过参数来向对方传送数据,而通过返回值来从对方处获取传送
一个异步的实现方法为
function runAsyncFunc(func,...)
local current = coroutine.running
func.callback = function() coroutine.resume(current) end
coroutine.yield --等待动作完成后通过回调函数来恢复执行
end
function runAsyncFunc(func,...)
local current = coroutine.running
func.callback = function() coroutine.resume(current) end
coroutine.yield --等待动作完成后通过回调函数来恢复执行
end
一个读写消费者的例子:
function producer()
return coroutine.create(function()
while true do
local data = io.read()
coroutine.yield(data)
end
end)
end
function consumer(p)
while true do
local status, data = coroutine.resume(p)
print(data)
end
end
consumer(producer())
添加 filter:
function filter(source)
return coroutine.create(function ()
for x = 1, 10 do
local status, data = coroutine.resume(source)
cortine.yield('from filter' .. data)
end
end)
end
function consumer(filter)
while true do
local status, data = coroutine.resume(filter)
if not status then return end
print (data)
end
end
comsumer(filter(producer()))