2012-07-15 5 views
2

나는 지난 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을 사용하십시오. 타이머는 코 루틴이 여전히 실행 중인지 여부를 확인하기 위해 스크립트의 원래 작성자가 초기화 한 것입니다. 완료 될 때까지 매초마다 백그라운드를 파싱합니다. 비록 프로그램에서 비동기 적으로 실행되는 것처럼 보이지만 정직하게 말하면, 올바르게 수행했는지는 확실하지 않습니다.

그래서 한 블록에서 여러 요청을 받고 여러 응답을 올바르게 반환 할 수 있습니까? 아니면 루아가 처리 할 수있는 작업이 너무 많습니까?

답변

1

Chapter 9.4이 처리하는 방법에 상당히 좋은 예제를 포함 잘못된 문제, 코 루틴 사용 s 및 LuaSocket의 socket.select() 함수를 사용하여 부풀림을 방지합니다.

불행히도 socket.http 함수를 socket.select와 함께 사용하는 방법이 없다고 생각합니다. PiL 예제의 코드는 종종 필요한 모든 것이지만 요청 된 URL이 리다이렉트를 보내는 것과 같이 일반적인 경우는 처리하지 못합니다.

+0

사실 PiL 링크를 기반으로 훌륭한 아이디어를 얻었습니다. 감사! – Josh

5

코 루틴은 그렇게 작동하지 않습니다. 그들은 사실, 차단하고 있습니다.

문제는 "잠시 동안 실행할 수있는 기능을 원하고 다른 일을 수행하기 위해 돌아가서 돌아 왔을 때 돌아 왔을 때와 같은 상태로 돌아갑니다"라는 문제를 해결했습니다.

"나는 다른 일을하는 동안 계속 뛰고 싶다"고 말하지 않았다는 것을 주목하십시오. 코 루틴에서 코드의 흐름이 멈추고 다시 돌아올 때만 계속됩니다.

코 루틴을 사용하면 코드가 어떻게 동작 하는지를 수정할 수 있으며 (경우에 따라서는 용이하게) 코드를보다 분명하게 또는 쉽게 읽을 수 있습니다. 하지만 여전히 엄격하게 단일 스레드입니다.

루아 구현하는 C99로 지정해야한다는 것을 기억하십시오. 이 표준은 스레드 구현과 함께 제공되지 않으므로 기본적으로 Lua는 엄격하게 단일 스레드입니다. 멀티 스레딩을 원하면 외부 lib에 연결해야합니다. 예를 들어, luvit은 이것을 달성하기 위해 libajv lib와 Luajit를 연결합니다.

몇 가지 좋은 참조 :