【发布时间】:2012-07-14 12:14:45
【问题描述】:
在过去的 12 个小时里,我一直在研究这个主题,但我似乎一无所获。我什至不知道这是否可能,但我希望这是因为它对继续我的项目大有帮助。
我试图做的是创建协程,这样我使用的特定程序就不会因为无法执行异步 http 请求而冻结。尽管我对协程的理解还停留在“嗯?它是如何工作的?”中,但我已经想出了如何去做那部分。阶段。我现在的问题是能够使用正确的信息响应多个请求。例如,以下应该产生三个单独的响应:
foo(a)
foo(b)
foo(c)
foo 用里面的参数启动一个协程。如果全部单独请求,则返回正确的结果。但是,如果作为块请求,它只会返回foo(c) 的结果。现在,我理解了这背后的原因,但我无法找到一种方法让它在作为一个块被请求时返回所有三个结果。为了帮助理解这个问题,下面是实际代码:
function background_weather()
local loc = url.escape(querystring)
weatherpage = http.request("http://api.wunderground.com/api/004678614f27ceae/conditions/q/" .. loc .. ".json")
wresults = json.decode(weatherpage)
--process some stuff here, mainly datamining
end
--send datamined information as a response
coroutine.yield()
end
以及协程的创建:
function getweather ()
-- see if backgrounder running
if background_task == nil or
coroutine.status (background_task) == "dead" then
-- not running, create it
background_task = coroutine.create (background_weather)
-- make timer to keep it going
AddTimer ("tickler", 0, 0, 1, "",
timer_flag.Enabled + timer_flag.Replace,
"tickle_it")
end -- if
end -- function
querystring 变量由初始请求设置。我没有在这里包含它,但是为了测试,使用12345 作为querystring 变量。计时器是脚本的原始作者初始化的东西,用于检查协程是否仍在运行,每秒戳一次背景直到完成。老实说,我什至不确定我是否正确地执行了此操作,尽管它似乎在程序中异步运行。
那么,是否可以在一个块中接收多个请求并返回多个响应,正确吗?还是 Lua 无法处理的任务太多?
【问题讨论】: