2010-01-26 5 views
0

Ruby에서 몇 초가 걸리는 계산 집중적 인 작업을 즉시 시작하는 컨트롤러 동작이 있습니다. 클라이언트가 내 서버를 폴링하고 상태 업데이트를 얻길 원합니다. 내 컨트롤러에서임시 데이터를 레일에 저장하는 위치

: check_status는 별도의 스레드에 의해 저장되는 상태를 당길 필요가 어떻게

def complex_task 
    Thread.new do 
    loop do 
     one_part_of_the_computationally_intensive_task 
     # Note how much progress we've made, in case the client asks. 
     save_progress 
    end 
    end 
    # returns to client straightaway, but task continues in background. 
end 

def check_status 
    # Retrieve state in here. 
    get_progress 
end 

참고.

save_progressget_progress 기능을 어떻게 작성합니까? 어디서 상태를 저장합니까? 이것이 클라이언트에게 전송되기 때문에 session에 저장하는 것은 좋지 않은 것처럼 보입니다. 그러나 다른 곳에서 저장합니까?

(this question 관련,하지만 훨씬 더 일반적인. 나는 완전히 다른 답변을 기대합니다.)

답변

3

delayed_job을 살펴보십시오. (... 또는 당신도 set_status()check_status()는 delayed_job을 추가 할 수 있습니다) delayed_job 원래 Shopify에서 추출한 것을

주 작업이 delayed_jobs 테이블에 진행 상황을 기록 할 수 있도록 쉽게 check_status() 방법으로 이후의 추출,이를 확장 할 수 ; 나는 그것이 실제 세계에 대한 확실한 노출을 가지고 있다는 것을 의미한다고 생각합니다. 나는 꽤 강한 이유가 없다면, 내 자신을 굴리는 것보다 그 기지에서 시작하는 것을 선호 할 것입니다.

1

당신은 모델의 상태를 저장하고, 세션에 status_id를 넣을 수 있습니다. 또는 쿠키 기반 세션 대신 데이터베이스 세션 저장소를 사용할 수 있습니다. 이렇게하면 세션 속도를 희생하면서 서버 측 세션에 넣은 데이터를 유지할 수 있습니다.

관련 문제