데이터베이스에 세 개의 가능한 상태 (사용중, 사용 중, 사용됨)가있는 플래그가있는 테이블이있는 Yesod 앱이 있습니다. 기본값은 다음과 같습니다.Yesod의 시간 초과 기능
사용자가 버튼을 클릭 할 때 데이터베이스의 플래그가 사용으로 변경되면 플래그가 사용되지 않음 (다른 사용자가 다른 버튼을 사용하는 작업)으로 변경되지 않은 경우 10 분 후 플래그가 ToUSe로 돌아가고, 문제는 검색 데이터베이스를 편집하는 작업을 지연시킬 수있는 방법을 찾을 수 없다는 것입니다. Yesod에서 가능한지 확실하지 않습니다.
검색 timeout 라이브러리를 찾았지만 해당 라이브러리 만 프로그램 실행으로 시작이 지연되지 않는다
Control.Concurrent
을 사용하려고하는데 다음과 같은 오류가 발생합니다.
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.
...
[timeout] (https://hackage.haskell.org/package/base-4.9.0.0/docs/System-Timeout.html#v:timeout)? 문자 그대로 "Haskell timeout"에 대한 Google의 첫 번째 히트. 그 최소한의 노력을하지 않았다면 부끄러운 줄 알았습니다. 그렇게했다면 왜 그렇게되지 않을지에 대해 질문해야합니다. –
FWIW 인 경우, yesod 핸들러에서 'lifted-base'의'timeout'을 사용하여 다음과 같이 할 수 있습니다 : https://hackage.haskell.org/package/lifted-base-0.2.3.8/docs/System -Timeout-Lifted.html. – creichert
@DanielWagner 그들이 지연을하지 않는 타임 아웃 기능에 대한 문서를 올바르게 이해한다면, n 밀리 초를 초과하면 함수의 실행을 멈춘다. – oriaj