我可以在Yesod或任何其他具有可比数据库功能的Haskell Web框架中进行长时间轮询吗?
确切地说,我想延迟HTTP响应,直到发生一些有趣的事情。还应该有一个超时,在此之后客户端将收到一条回复,说“没有发生”,然后客户端将发出相同的请求。
为了让生活变得更加复杂,我想到的应用程序通过HTTP / HTML5和MIDP客户端的真正紧凑的UDP协议提供所有功能。来自任一协议的事件都可以在任一协议中释放响应
TIA, 阿德里安。
答案 0 :(得分:7)
我无法回答更复杂的UDP内容的所有问题,但简短的回答是,是的,Yesod支持长轮询。你基本上可以这样做:
myHandler = do
mres <- timeout timeoutInMicroseconds someAction
case mres of
Nothing -> return nothingHappenedResponse
Just res -> doSomething res
您可能希望使用来自提升基础软件包的System.Timeout.Lifted。
答案 1 :(得分:4)
timeout
的参数是微秒而不是纳秒。
等待有趣的事情发生在&#39;部分,我们使用来自check
的{{1}}组合器(包装Control.Concurrent.STM
),以便我们的处理程序线程等待retry
:
TVar
与此同时,其他线程(包括HTTP处理程序)正在更新someAction = do
interestingStuff <- atomically $ do
currentStuff <- readTVar theStuff
check $ isInteresting currentStuff
return currentStuff
respondWith interestingStuff
- 每次更新都会触发theStuff :: TVar Stuff
的新计算,如果返回isInteresting
则可能会响应。
这与通过UDP提供相同信息兼容:只需在UDP服务器线程和Yesod线程之间共享True
。