在过去的12个小时里,我一直关注这个主题,而且我根本无法找到任何地方。我甚至不知道这是否可行,但我希望这是因为它将继续我的项目很长的路要走。协程,Lua中的多个请求
我试图做的是创建协程,所以我使用的特定程序不能冻结,因为它无法执行异步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来说是一项太多的任务吗?
我实际上已经根据PiL链接给出了一个好主意。谢谢! – Josh 2012-07-15 21:57:45