2016-11-16 1 views
2

데이터베이스에 세 개의 가능한 상태 (사용중, 사용 중, 사용됨)가있는 플래그가있는 테이블이있는 Yesod 앱이 있습니다. 기본값은 다음과 같습니다.Yesod의 시간 초과 기능

사용자가 버튼을 클릭 할 때 데이터베이스의 플래그가 사용으로 변경되면 플래그가 사용되지 않음 (다른 사용자가 다른 버튼을 사용하는 작업)으로 변경되지 않은 경우 10 분 후 플래그가 ToUSe로 돌아가고, 문제는 검색 데이터베이스를 편집하는 작업을 지연시킬 수있는 방법을 찾을 수 없다는 것입니다. Yesod에서 가능한지 확실하지 않습니다.

검색 timeout 라이브러리를 찾았지만 해당 라이브러리 만 프로그램 실행으로 시작이 지연되지 않는다

Control.Concurrent을 사용하려고하는데 다음과 같은 오류가 발생합니다.

,210
testTimeOut = do  
    c1 <- atomically $ newTQueue 
    C.forkIO $ do 
    C.threadDelay (2 * 1000000) 
    id <- runDB $ insert $ SubForm "ToUse" 10 
    atomically $ do 
     writeTQueue c1 "result 1" 

유형의 실제의 형태와 'IO t0의' 가 'HandlerT site0 IO (키 하위 폼)'

는 편집이

이 코드 작품은 나에게

를 형성 기대와 일치 할 수 없습니다
getFooR :: Handler RepHtml 
getFooR = do 
    runInnerHandler <- handlerToIO 
    liftIO $ forkIO $ runInnerHandler $ do 
    Code here runs inside GHandler but on a new thread. 
    This is the inner GHandler. 
    ... 
    Code here runs inside the request's control flow. 
    This is the outer GHandler. 
    ... 
+1

[timeout] (https://hackage.haskell.org/package/base-4.9.0.0/docs/System-Timeout.html#v:timeout)? 문자 그대로 "Haskell timeout"에 대한 Google의 첫 번째 히트. 그 최소한의 노력을하지 않았다면 부끄러운 줄 알았습니다. 그렇게했다면 왜 그렇게되지 않을지에 대해 질문해야합니다. –

+0

FWIW 인 경우, yesod 핸들러에서 'lifted-base'의'timeout'을 사용하여 다음과 같이 할 수 있습니다 : https://hackage.haskell.org/package/lifted-base-0.2.3.8/docs/System -Timeout-Lifted.html. – creichert

+0

@DanielWagner 그들이 지연을하지 않는 타임 아웃 기능에 대한 문서를 올바르게 이해한다면, n 밀리 초를 초과하면 함수의 실행을 멈춘다. – oriaj

답변

0

나는 당신이 찾고 있다고 가정합니다. forkHandler.

+0

나에게 맞는 예제를 사용하여 내 대답을 편집하고 참조하는 패키지에 있습니다. Yesod.Core.Handler – oriaj

관련 문제