나는 지난 12 시간 동안이 주제에 대해 집중적으로 연구 해왔다. 이것이 가능하다면 나는 모른다. 그러나 내 프로젝트를 계속 진행하는 데는 먼 길을 가기 때문에 그것이 있기를 바라고있다.코 루틴, 루아의 복수 요청
내가 시도하는 것은 coroutines를 작성하여 사용하는 특정 프로그램이 비동기 http 요청을 수행 할 수 없기 때문에 멈추지 않도록하기 위해서입니다. 나는 coroutines에 대한 나의 이해가 여전히 "어? 어떻게 작동합니까?"라고하면서, 그 부분을 어떻게하는지 알아 냈습니다. 단계. 이제 내 문제는 정확한 정보를 가진 여러 요청에 응답 할 수있게되었습니다. 예를 들어, 다음 세 개의 응답을 생성한다 :
foo
내부 파라미터와 코 루틴을 개시
foo(a)
foo(b)
foo(c)
. 모두 별도로 요청한 경우 적절한 결과를 반환합니다. 그러나 블록으로 요청하면 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
변수가 초기 요청으로 설정되어이 문제를 조금 이해를 돕기 위해, 여기에 실제 코드입니다. 여기에 포함시키지 않았지만 테스트를 위해 querystring
변수로 12345
을 사용하십시오. 타이머는 코 루틴이 여전히 실행 중인지 여부를 확인하기 위해 스크립트의 원래 작성자가 초기화 한 것입니다. 완료 될 때까지 매초마다 백그라운드를 파싱합니다. 비록 프로그램에서 비동기 적으로 실행되는 것처럼 보이지만 정직하게 말하면, 올바르게 수행했는지는 확실하지 않습니다.
그래서 한 블록에서 여러 요청을 받고 여러 응답을 올바르게 반환 할 수 있습니까? 아니면 루아가 처리 할 수있는 작업이 너무 많습니까?
사실 PiL 링크를 기반으로 훌륭한 아이디어를 얻었습니다. 감사! – Josh