lua coroutine 异步转同步
2016-06-08 20:54
447 查看
local Thread = require("llthreads2.ex")
local socket = require("socket")
local http = require("socket.http")
taskList = {}
function startHttpRequestTask(url, callback)
print("startHttpRequest", url)
local task = Thread.new(function(url)
local http = require("socket.http")
local ltn12 = require("ltn12")
print("request", url)
local t = {}
local respt = http.request{
url = url,
sink = ltn12.sink.table(t)
}
return table.concat(t)
end, url)
task:start()
taskList[#taskList + 1] = {task = task, callback = callback}
end
function AsyncHttpRequest(url)
local coro = coroutine.running()
print("load :", url)
startHttpRequestTask(url, function(result) coroutine.resume(coro, result) end)
end
function update()
if #taskList > 0 then
for idx = #taskList, 1, -1 do
local taskInfo = taskList[idx]
local task = taskInfo.task
if not task:alive() then
local ok, ret = task:join()
local callback = taskInfo.callback
print("task done")
callback(ret)
table.remove(taskList, idx)
end
end
return true
else
print("all task complete")
return false
end
end
function cofunction()
print("start")
local dataList = {"http://www.baidu.com", "http://www.python.com", "http://www.sina.cn"}
for idx, data in ipairs(dataList) do
local param = data
print("loadAsync:", param)
local res = coroutine.yield(AsyncHttpRequest(param))
print("task result:", string.sub(res, 1, 100) .. "...")
end
end
co = coroutine.create(cofunction)
print(coroutine.resume(co))
function loop()
while update() do
socket.sleep(1.0 / 60)
--print("update")
end
end
loop()
local socket = require("socket")
local http = require("socket.http")
taskList = {}
function startHttpRequestTask(url, callback)
print("startHttpRequest", url)
local task = Thread.new(function(url)
local http = require("socket.http")
local ltn12 = require("ltn12")
print("request", url)
local t = {}
local respt = http.request{
url = url,
sink = ltn12.sink.table(t)
}
return table.concat(t)
end, url)
task:start()
taskList[#taskList + 1] = {task = task, callback = callback}
end
function AsyncHttpRequest(url)
local coro = coroutine.running()
print("load :", url)
startHttpRequestTask(url, function(result) coroutine.resume(coro, result) end)
end
function update()
if #taskList > 0 then
for idx = #taskList, 1, -1 do
local taskInfo = taskList[idx]
local task = taskInfo.task
if not task:alive() then
local ok, ret = task:join()
local callback = taskInfo.callback
print("task done")
callback(ret)
table.remove(taskList, idx)
end
end
return true
else
print("all task complete")
return false
end
end
function cofunction()
print("start")
local dataList = {"http://www.baidu.com", "http://www.python.com", "http://www.sina.cn"}
for idx, data in ipairs(dataList) do
local param = data
print("loadAsync:", param)
local res = coroutine.yield(AsyncHttpRequest(param))
print("task result:", string.sub(res, 1, 100) .. "...")
end
end
co = coroutine.create(cofunction)
print(coroutine.resume(co))
function loop()
while update() do
socket.sleep(1.0 / 60)
--print("update")
end
end
loop()
相关文章推荐
- 详解Lua中的表的概念及其相关操作方法
- Lua编程示例(二):面向对象、metatable对表进行扩展
- 把Lua编译进nginx步骤方法
- Lua脚本自动生成APK包
- Lua中的元表(metatable)、元方法(metamethod)详解
- Lua中的metatable介绍
- Lua中ipair和pair的区别
- Lua中的函数精讲笔记
- 浅谈Lua的面向对象特性
- 详解Lua中的变量相关知识点
- Lua脚本语言入门笔记
- Lua脚本调用外部脚本
- 详解Lua中的if语句的使用方法
- Lua中调用函数使用点号和冒号的区别
- Lua中的闭合函数、非全局函数与函数的尾调用详解
- Lua中强大的元方法__index详解
- Lua中调用C++函数示例
- Lua面向对象之类和继承浅析
- Lua性能优化技巧(一):前言
- Lua中获取table长度问题探讨